Ошибки рисования Python OpenCV после манипуляции массивом с numpy

Я читаю изображение с OpenCV и пытаюсь что-то сделать с ним в numpy (rotate 90deg). Просмотр результата с imshow из matplotlib, все это, кажется, работает просто отлично – изображение вращается. Однако я не могу использовать методы рисования из OpenCV на новом изображении. В следующем коде (я запускаю это в рабочем листе sagemath cloud):

 %python import cv2 import matplotlib.pyplot as plt import numpy as np import os, sys image = np.array( cv2.imread('imagename.png') ) plt.imshow(image,cmap='gray') image = np.array(np.rot90(image,3) ) # put it right side up plt.imshow(image,cmap='gray') cv2.rectangle(image,(0,0),(100,100),(255,0,0),2) plt.imshow(image,cmap='gray') 

Я получаю следующую ошибку в команде cv2.rectangle() :

 TypeError: Layout of the output array img is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels) 

Ошибка исчезнет, ​​если я использую np.array(np.rot90(image,4) ) вместо этого (т.е. поверните его на 360). Таким образом, похоже, что изменения в измерениях испортили его. Поддерживает ли OpenCV размеры где-то внутри, что мне нужно обновить или что-то еще?

EDIT: добавление image = image.copy() после того, как rot90() решил проблему. См. Ответ Rayryeng ниже.

По-видимому, это ошибка в оболочке OpenCV Python. Если вы посмотрите на этот вопрос здесь: np.rot90 () искажает изображение opencv , видимо делая поворот, который не возвращается в исходные размеры, искажает изображение, а OP в этом сообщении испытывает ту же ошибку, что и у вас. FWIW, я также испытал ту же ошибку … не знаю, почему.

Способ вокруг этого состоит в том, чтобы сделать копию изображения после поворота, а затем показать изображение. Это я не могу объяснить, но, похоже, это работает. Кроме того, убедитесь, что вы вызываете plt.show() в конце вашего кода, чтобы показать изображение:

 import cv2 import matplotlib.pyplot as plt import numpy as np import os, sys image = np.array( cv2.imread('imagename.png') ) plt.imshow(image,cmap='gray') image = np.array(np.rot90(image,3) ) # put it right side up image = image.copy() # Change plt.imshow(image,cmap='gray') cv2.rectangle(image,(0,0),(100,100),(255,0,0),2) plt.imshow(image,cmap='gray') plt.show() # Show image