Невозможно нарисовать линию на изображении, не создав его копию. (Проблема существует только в изображениях .png) - PullRequest
1 голос
/ 14 апреля 2020

Приведенный ниже код не рисует никаких линий на изображении png

imgPath = "./images/dummy.png"

img = cv2.imread(imgPath,cv2.IMREAD_UNCHANGED) 
imgBGR = img[:,:,:3] 
imgMask = img[:,:,3]

cv2.line(imgBGR, (200,100), (250,100), (0,100,255), thickness=9, lineType=cv2.LINE_AA)
plt.imshow(imgBGR[:,:,::-1])

При создании копии канала BGR и использовании ее для рисования линий работает.

imgPath = "./images/dummy.png"

img = cv2.imread(imgPath,cv2.IMREAD_UNCHANGED) 
imgBGR = img[:,:,:3] 
imgMask = img[:,:,3]

imgBGRCopy = imgBGR.copy()

cv2.line(imgBGRCopy , (200,100), (250,100), (0,100,255), thickness=9, lineType=cv2.LINE_AA)
plt.imshow(imgBGRCopy [:,:,::-1])

Пожалуйста, объясните, почему?

1 Ответ

0 голосов
/ 15 апреля 2020

По загадочной причине OpenCV не удается отрисовать срез NumPy.

См., Например, следующий пост: Почему cv2.line не может рисовать на 1 канале numpy Срез массива на месте?

Ошибка не связана с PNG против JPEG или BGR против BGRA.
Ошибка в том, что вы пытаетесь рисовать на срезе.

Например, следующий код также не работает:

imgBGR = cv2.imread('test.jpg', cv2.IMREAD_UNCHANGED)
imgB = imgBGR[:,:,0]  # Get a slice of imgBGR
cv2.circle(imgB, (100, 100), 10, 5)

В качестве альтернативы, вы можете нарисовать изображение BGRA.

Согласно Функции рисования * Документация 1016 *:

Примечание Функции не поддерживают альфа-прозрачность, когда целевое изображение 4-канальное , В этом случае цвет [3] просто копируется в перекрашенные пиксели. Таким образом, если вы хотите рисовать полупрозрачные фигуры, вы можете нарисовать их в отдельном буфере и затем смешать его с основным изображением.

Работает следующий код:

img = cv2.imread(imgPath,cv2.IMREAD_UNCHANGED) 
cv2.line(img, (200,100), (250,100), (0,100,255), thickness=9, lineType=cv2.LINE_AA)

imgBGR = img[:,:,:3] 
plt.imshow(imgBGR[:,:,::-1])

Примечание:
Python a OpenCV являются «открытым исходным кодом», поэтому теоретически мы можем следовать исходному коду и демистифицировать проблему.

...