首页 > 解决方案 > cv2.findCountours 为一个形状返回两倍的轮廓

问题描述

我用油漆创建的图像中有 12 个不同的形状,但 cv2.findCountours 返回 24 个轮廓。为什么会这样?我在其他地方没有找到任何答案。

这是我的测试图像: test.png 你可以清楚地看到有 12 个形状。当我遍历轮廓时,我得到 24 个形状

import cv2
import numpy as np

image = cv2.imread('test.png')
edges = cv2.Canny(image, 100, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    area = cv2.contourArea(cnt)
    print(area)

while (1):

    cv2.imshow("Original", image)
    cv2.imshow("Edges", edges)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

控制台返回:

935.0
913.0
4301.0
4271.0
6610.5
6579.0
2651.5
2639.5
11113.0
11070.5
6317.0
6271.0
2259.0
2237.0
4003.0
3981.0
13303.0
13208.0
16580.0
16511.5
6638.5
6594.0
7541.5
7527.5

标签: pythonopencvimage-processing

解决方案


正如文档所说:

CV_RETR_TREE 检索所有轮廓并重建嵌套轮廓的完整层次结构。这个完整的层次结构在 OpenCV contours.c 演示中构建并显示。

在这种情况下,对于您的每个轮廓,它会检测 2 个轮廓数组:一个是外部的,另一个是内部的。如果您将该行替换为以下内容,您的问题将得到解决:

contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

CV_RETR_EXTERNAL 仅检索极端外部轮廓。它为所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1。


推荐阅读