【问题标题】:Controlling opencv convex hull控制opencv凸包
【发布时间】:2019-01-21 11:25:45
【问题描述】:

我想在凸包下组合这张图片(阈值)上的对象:

import cv2
img = cv2.imread('test.png') #thresh1

ret, threshed_img = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),
                        220, 255, cv2.THRESH_BINARY)

image, contours, hier = cv2.findContours(threshed_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
    # get convex hull
    hull = cv2.convexHull(cnt)
    cv2.drawContours(img, [hull], -1, (0, 0, 255), 1)    
cv2.imwrite("output.png", img)

我可以通过控制阈值来制作一个凸包:

rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 30))
threshed = cv2.morphologyEx(threshed_img, cv2.MORPH_CLOSE, rect_kernel)
cv2.imwrite('thresh2.png', threshed)

imgContours, Contours, Hierarchy = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt in Contours:
    hull = cv2.convexHull(cnt)
    cv2.drawContours(img, [hull], -1, (0, 0, 255), 1) 
cv2.imwrite('output2.png', img)

我想要的是这个:

  1. 有没有比操纵阈值更好的方法来组合凸包下的对象?
  2. 如何实现显示的凸包?

【问题讨论】:

  • 首先找到单个轮廓(如在第一个图像对中),然后遍历所有找到的轮廓点,将它们聚合到一个列表中,并从这组点中检测凸包。 (如果需要,我可以稍后添加代码示例)。这是最方便的编码方式,就性能和复杂性而言,还有更好的方式。如果调整后的阈值适用于您的应用程序,请使用轮廓的层次结构并确定外部轮廓。但是,您呈现的期望结果不是凸包,因为它不是凸形状。
  • @ThomasBergmueller 是的,请您添加示例代码吗?

标签: python opencv


【解决方案1】:

您可以计算此图像上小块的凸包。

然后添加一些凸包点到你创建的轮廓。这些要点应该是:

a) 每个凸包的最左端(x 坐标最低)

b) 每个凸包的极右点(x 坐标最高)

c) 所有 5 个凸包中的最高点(y 坐标最低)。

d) 所有 5 个凸包的最低点(y 坐标最高)。

您的结果轮廓将类似于

有些点会在等高线之外。如果所有点都应该在轮廓内您可以检查凸包之前计算的 5 个点中的所有点是否在结果轮廓内(使用pointPolygonTest 函数)。它们不仅仅是将它们添加到结果轮廓中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 2012-10-10
    • 1970-01-01
    • 2012-08-02
    • 2013-02-20
    • 2012-06-13
    • 2013-08-11
    • 2018-05-17
    相关资源
    最近更新 更多