【问题标题】:findContours returns contour with duplicate pointsfindContours 返回带有重复点的轮廓
【发布时间】: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


【解决方案1】:

我无法在评论中上传图片。您的边缘检测是否有可能出现问题并且有一些小的开口?结果是顶部正在计算边缘旁边的区域并通过打开来打破。底部正在计算整个图像?蓝色区域表示实际计算的区域。因为边缘检测有一个中断,那么这个区域实际上是很小的。边缘在几个点上部分失败是很常见的。

如果假设存在一些像素中断(您的线不连续),则此假设的结果符合您的描述

A.一个很小的区域,

B.将弧长和顶点数加倍

C.有些点是重复的,因为它们在同一条线上。

处理这个开口是使用形态扩张或凸包来缩小差距。

【讨论】:

  • 这对我有用:我使用 kernel = np.ones((2,2), np.uint8) edges = cv2.dilate(edges,kernel,iterations = 1) 来扩大边缘
  • 恭喜,继续。猜猜你必须为一个项目用那个号码做某事。
猜你喜欢
  • 1970-01-01
  • 2019-01-03
  • 2012-07-03
  • 2020-09-03
  • 2018-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多