По загадочной причине 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 являются «открытым исходным кодом», поэтому теоретически мы можем следовать исходному коду и демистифицировать проблему.