Как нарисовать круг и написать на нем - PullRequest
0 голосов
/ 22 марта 2020

Это эталонное изображение: enter image description here

Мне нужно нарисовать на нем круги так же, как и эталонное изображение: enter image description here

Это результирующее изображение: enter image description here

Вот как выглядит код:

img = cv2.imread("foot.png")
cv2.circle(img,(112,71), 4, (0,0,0), -1)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, '1', (112,71), font, 1, (84, 29, 108), 1, cv2.LINE_AA)


cv2.imwrite("test.png",img)

Как таким же образом поместить число в круг как на эталонном изображении? Пиксели, приведенные в коде, предназначены для первой позиции.

Редактировать: я пробовал это решение на Stackoverflow, и оно дало этот результат Рисование текста внутри круга OpenCV

enter image description here

Редактировать 1: код:

img = cv2.imread("foot.png")

CENTER = (112, 71)

cv2.circle(img, CENTER, 2, (127,0,127), -1)

TEXT_FACE = cv2.FONT_HERSHEY_DUPLEX
TEXT_SCALE = 1
TEXT_THICKNESS =1
TEXT = "0"

text_size, _ = cv2.getTextSize(TEXT, TEXT_FACE, TEXT_SCALE, TEXT_THICKNESS)
text_origin = ( int(CENTER[0] - text_size[0] / 2), int(CENTER[1] + text_size[1] / 2))

cv2.putText(img, TEXT, text_origin, TEXT_FACE, TEXT_SCALE, (127,255,127), TEXT_THICKNESS, cv2.LINE_AA)

cv2.imwrite('centertext_out.png', img)

Выход: enter image description here

Редактировать:

Это то, чего я добился до сих пор: enter image description here

Есть ли способ не допустить, чтобы круги во второй строке перекрывали друг друга? Можно ли запретить кружкам покрывать текст?

1 Ответ

0 голосов
/ 23 марта 2020

Вы можете использовать разные библиотеки. Я думаю, что вместо opencv matplotlib, bokeh или seaborn должны лучше подходить для такой работы. Вы можете сделать scatter plot с любым из них и обозначить свои баллы цифрами. Уверяю вас, это выглядело бы намного лучше.

Как вы и просили, приведу быстрый пример. enter image description here

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("your_image_here.png")

Я использовал opencv только для чтения изображения. Затем указываются координаты x и y по пикселям в массиве. Также значения меток как n.

x = [120,110,150,367,377,337]
y = [100,200,300,100,200,300]
n = [5.0,4.8,20.5,5.0,4.8,20.5]

, затем я нанес на карту точек на вершине изображения с желаемыми параметрами, такими как размер точки, цвет, непрозрачность и размер метки.

fig, ax = plt.subplots(figsize=(10, 10))

ax.imshow(img)
ax.scatter(x, y, s=200, alpha=0.7, c = "orange")

for i, num in enumerate(n):
    ax.text(x[i], y[i], num, fontsize=12)

Это просто короткая демонстрация. Вы также можете определить функцию для настройки цветов точек в соответствии со значениями меток или, если точки становятся слишком тесными, вы можете уменьшить их динамически с помощью другой функции. Я хотел бы подчеркнуть, что Opencv не такой практичный для такой задачи, как ваша. Надеюсь, это помогло. Удачи. :)

...