首页 > 解决方案 > convexityDefects 错误的输出(没有足够的缺陷!)

问题描述

我正在处理一个关于圆检测的问题,我已经达到了一些合并的结构,比如下一个(希望它不会失去质量):

https://cdn1.imggmi.com/uploads/2020/4/17/6c447e49890278d40c9a44d109772b87-full.png

我的想法是通过首先使用 hullConvex 函数来查找这些交点,以查找凸包络,然后使用 convexityDefects 来查找作为缺陷的凸点。然而,convexityDefects 似乎失败了,因为我得到了这个:

https://cdn1.imggmi.com/uploads/2020/4/17/1ab59bfaaaa5a2e6f4e054dfd798d301-full.png

在这里,我们有黄色的原始轮廓,蓝色的船体轮廓和模型发现的红色缺陷。

不相交的点很容易通过缺陷的深度过滤去除,但我错过了上面的两个相交点。而且我确实认为它们应该在理论上出现。我在这里分享我的代码:

def roi_contour(roi):
    drawing = np.zeros((roi.shape[0], roi.shape[1], 3), np.uint8)
    cntsSorted, hierarchy = cv2.findContours(roi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    #cntsSorted = sorted(sub_cb, key=lambda x: cv2.contourArea(x),reverse=True)
    hull = []
    for i_x in range(len(cntsSorted)):
        hull.append(cv2.convexHull(cntsSorted[i_x]))
    cv2.drawContours(drawing, cntsSorted, 0, (255, 255, 255), -1, 8, hierarchy)
    cv2.drawContours(drawing, cntsSorted, 0, (0, 255, 255), 2, 8, hierarchy)
    cv2.drawContours(drawing, hull, 0, (255,0,0), 2, 8, hierarchy)
    cnt = cntsSorted[0]
    env = cv2.convexHull(cnt,returnPoints = False)
    defectos = cv2.convexityDefects(cnt,env)
    points_def = []
    try:
        for k in range(defectos.shape[0]):
            i,f,l,d = defectos[k,0]
            maslejano = tuple(cnt[l][0])
            #if d>6000:
            points_def.append(maslejano)
            cv2.circle(drawing,maslejano,3,[0,0,255],-1)
    except:
        pass

我什至考虑过它们在数学上是非凸的可能性,但我很确定(特别是因为较低的几乎相等)这不是问题......

我对这个函数有什么误解还是openCV的库失败?

非常感谢您的帮助,伙计们!

标签: pythonopencv

解决方案


推荐阅读