我遇到过cv2.findContours
的非常奇怪的行为,它在两个相同的数组上执行代码失败和成功。
首先,我对一个图像做了一些任意的图像处理,然后收到我的输出,它是灰度的。我们把输出赋给变量estimate
. estimate.shape = (512, 640)
,因为它是一个灰度图像。然后我继续用cv2.imwrite('estimate.png', estimate)
把这个图像保存到磁盘,这就是我的代码开始出现问题的地方。
首先,我尝试从磁盘读取映像,并根据documentation on OpenCV使用cv2.findContours()
对其进行处理。代码如下所示,并成功执行:
im = cv2.imread('estimate.png')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
这和预期的一样。但是现在,让我们直接在变量estimate
上尝试cv2.findContours()
,而不是不必要地将其保存到磁盘并从中阅读:
ret, thresh = cv2.threshold(estimate, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
>>> error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\thresh.cpp:1659: error: (-210:Unsupported format or combination of formats) in function 'cv::threshold'
好的,这里的自然假设是imgray
不同于estimate
。让我们检查一下数据:
type(imgray)
>>> numpy.ndarray
type(estimate)
>>> numpy.ndarray
imgray.shape
>>> (512, 640)
estimate.shape
>>> (512, 640)
np.all(estimate == imgray)
>>> True
好了,数组的形状和值都是相同的。这是怎么回事?我们将cv2.findContours()
应用于完全相同的numpy. ndarray。如果直接创建数组,则会失败;如果通过cv2.imread
创建数组,则会成功?
我使用的是opencv-python=4.6.0.66和python=3.9.12
1条答案
按热度按时间eh57zj3b1#
终于解决了这个问题。原来,尽管看起来一样,问题出在实际的数组类型上。
cv2.findContours()
取无符号8位整数数组,因此,估计值需要转换:estimate = estimate.astype(np.uint8)
.这可以使用
estimate.dtype
和imgray.dtype
进行检查。