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
我正在使用 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