opencv cv2.findContours()在相同数组上成功和失败

50few1ms  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(153)

我遇到过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

eh57zj3b

eh57zj3b1#

终于解决了这个问题。原来,尽管看起来一样,问题出在实际的数组类型上。
cv2.findContours()取无符号8位整数数组,因此,估计值需要转换:estimate = estimate.astype(np.uint8) .
这可以使用estimate.dtypeimgray.dtype进行检查。

相关问题