OpenCV findContours() 只有在预先保存和读取图像时才会检测轮廓

OpenCV findContours() detects contours only if the image is saved and read beforehand

提供一些上下文: 我正在尝试获取此图像中的框数,

我将上面的图像存储在一个 ndarray blank_img.

如果我运行以下内容:

v = np.median(blank_img)
sigma = 0.33
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edges = cv2.Canny(blank_img, lower, upper, 3)
edges = cv2.dilate(edges, np.ones((2, 2), dtype=np.uint8))

cnts= cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

len(cnts) 等于 1。 但是,如果我在 canny 边缘检测和 findContours 之前保存数组 blank_img,如下所示:

cv2.imwrite('boxes.jpg', blank_img)

blank_img = cv2.imread('boxes.jpg')

现在,当我 运行 我的 findContour 代码片段时,len(cnts) > 1。我想知道如何修复它,这样我就不需要图像保存开销了。

~~编辑~~ 找到我用来创建的以下代码 blank_img

blank_img = 255*np.zeros((height, width, 3), np.uint8)
for line in lines:
    x1, y1, x2, y2 = line
    cv2.line(blank_img,(x1,y1),(x2,y2),(255,255,255),1)

其中 lines 是 HoughLinesP 返回的行列表:

lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, None,minlinelength,maxlinegap)

问题出在这里:

查看此图片:

左下角的小绿色独立矩形是在保存图像并再次读取时创建的。 cnts的实际长度应该只有1(外面的大矩形)。

在您存储图像并再次读取图像后,这个小矩形出现在 Canny 边缘图像中。我不知道为什么在存储图像然后读取时会检测到它。只需删除2行并直接使用图像即可。