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

时间:2015-05-14 23:20:50

标签: python image opencv image-processing 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是否在内部存储了我需要更新的维度?

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

3 个答案:

答案 0 :(得分:10)

这显然是Python OpenCV包装器中的一个错误。如果你在这里查看这个问题:np.rot90() corrupts an opencv image,显然做一个不会导致原始尺寸的旋转会破坏图像,并且该帖子中的OP会遇到与您相同的错误。 FWIW,我也经历过同样的错误....不知道为什么。

解决此问题的方法是在旋转后对图像进行复制,然后显示图像。这个我无法解释,但似乎有效。此外,请务必在代码末尾致电00055 /// GlobalVariable ctor - If a parent module is specified, the global is 00056 /// automatically inserted into the end of the specified modules global list. 00057 GlobalVariable(Type *Ty, bool isConstant, LinkageTypes Linkage, 00058 Constant *Initializer = nullptr, const Twine &Name = "", 00059 ThreadLocalMode = NotThreadLocal, unsigned AddressSpace = 0, 00060 bool isExternallyInitialized = false); 显示图片:

plt.show()

答案 1 :(得分:2)

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

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

Reference

答案 2 :(得分:1)

转换数据类型适用于我的问题。 转换前图像的类型为np.int64。

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