Python 使用 numpy 操作数组后 OpenCV 绘图错误

Python OpenCV drawing errors after manipulating array with numpy

我正在使用 OpenCV 读取图像,并尝试在 numpy 中对其进行处理(旋转 90 度)。使用来自 matplotlib 的 imshow 查看结果,一切似乎都运行良好 - 图像已旋转。但是,我不能在新图像上使用 OpenCV 的绘图方法。在以下代码中(我在 sagemath 云工作表中 运行):

%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 是否将尺寸存储在我需要更新的内部某个地方?

编辑:rot90() 之后添加 image = image.copy() 解决了问题。请参阅下面 rayryeng 的回答。

这显然是 Python OpenCV 包装器中的错误。如果您在这里查看这个问题:np.rot90() corrupts an opencv image,显然进行旋转不会导致返回原始尺寸会破坏图像,并且 post 中的 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

转换数据类型可以解决我的问题。 图片转换前是np.int64类型

image = image.astype(np.int32) # convert data type

我在使用 numpy 1.11.2 和 opencv 3.3.0 时遇到了同样的问题。不知道为什么,但这对我有用。 在使用 cv2.rectangle 之前,添加以下行:

image1 = image1.transpose((1,0)).astype(np.uint8).copy()

Reference