我正在使用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的答案。
答案 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()
答案 2 :(得分:1)
转换数据类型适用于我的问题。 转换前图像的类型为np.int64。
image = image.astype(np.int32) # convert data type