python - 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
解决方案
正如文档所说:
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。
推荐阅读
- django - 如何修复 django 2.2 中的搜索
- kubernetes - 外部流量是否可以访问我在 Minikube 中的部署?
- java - 如何序列化 SimpleIntegerProperty?
- ajax - 如何通过ajax更改“用户的活动/非活动状态”?
- php - 消息:CompactToken 解析失败,错误代码:8004920A,代码:InvalidAuthenticationToken
- python - Django:ImportError 无法导入名称“Github”
- javascript - 将javascript字符串长度转换为字节数组[]
- sql - TVP 是查询数据库以匹配值列表的正确方法吗?
- kubernetes - DNS 不适用于 K8s 上的一次部署
- c++ - 使用 stackBefore 更改 QGraphicsItem 堆栈顺序