我正在使用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) )
而非旋转 90 度,错误就会消失(即旋转 360 度)。因此似乎是因为尺寸的变化导致出现问题。OpenCV 是否在内部存储了尺寸,需要更新或其他操作?编辑: 在 rot90()
后添加 image = image.copy()
解决了这个问题。请参见 rayryeng 的答案。
cv2.imread()
只返回一个ndarray。该ndarray与OpenCV无关,并且我没有看到它以任何方式被破坏。唯一有意义的是,OpenCV单独或其他方式跟踪“图像”(ndarray)的尺寸。虽然这样做就不合理了,为什么复制解决方法会起作用呢? - argentum2f