【发布时间】:2019-06-04 12:58:56
【问题描述】:
OpenCV 的 findContours 有时会返回错误的结果
代码 sn-p 尝试在边缘图像中找到最大的轮廓。
在“坏”示例中,似乎轮廓的大多数顶点都被不必要地复制了。这会导致后续错误的 contourArea 和 pointPolygonTest 行为。
import cv2
import imutils
from scipy import misc
edges = misc.imread('edges3.png')
cnts = cv2.findContours(edges.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
sorted_cnts = sorted(cnts, key = lambda c:cv2.arcLength(c,True), reverse = True)
largest_cnt = sorted_cnts[0]
print("Largest contour area",cv2.contourArea(largest_cnt))
print("Largest contour arc length",cv2.arcLength(largest_cnt,True))
print("Largest contour num of vertx",len(largest_cnt))
错误代码输出:
Largest contour area 14.0 Largest contour arc length 2639.200133085251 Largest contour num of vertx 667
好代码输出:
Largest contour area 95534.0 Largest contour arc length 1321.8721450567245 Largest contour num of vertx 340
附上的两张照片几乎相同,应该返回相似的结果。但是,第一个返回的轮廓面积非常小,与第二个相比,弧长和顶点数增加了一倍。
【问题讨论】:
-
你能把你的输出和你想在手绘中实现的目标发布吗?以便其他人可以帮助您?
-
它看起来是一个合理的数字。您是否认为对于最大的矩形外观来说这太过分了?您必须记住,轮廓是点向量,以便尽可能准确地近似。如果你想要最小的表示,你可以使用凸包(猜猜它可以得到 4
-
主要问题是面积是 14 而不是 100,000。错误读取的根本原因是重复的顶点。
-
在处理复杂形状时看起来像一个错误。轮廓区域函数调用github.com/barak/opencv/blob/master/modules/imgproc/src/…icvContourArea,它逐行计算形状的开始和结束。又名 dxy。需要进行更多测试才能对源代码进行有效修复。同时,您可以使用凸包输出向量
作为计数区域的源吗?对于简单的情况,不应该有问题。附加信息。您使用的是哪个 opencv 版本。
标签: python opencv opencv-contour