首页 > 解决方案 > OpenCV 轮廓凹凸检测

问题描述

我有以下我想解决的问题:

纸杯是从它的侧面拍摄的,它的边缘和轮廓是用 Canny 和 findContours 功能找到的(请参阅下面附的 IMG1),然后我必须测试该轮廓是否是直的(没有任何颠簸或其他缺陷),如果它通过则返回或不。

编辑:根据 Christoph Rackwitz 的建议,我正在发布原始未更改的图像。

我已经成功实现了边缘检测,如下图 IMG1 所示,但现在我想删除部分未使用的边缘并希望获得 IMG2 中显示的结果。

最好的方法是什么?我脑子里想的几件事:

另一个问题是检测弯曲路径上的颠簸。我正在考虑几个可能的解决方案:

最好的结果显示在 IMG3 图像中。对我来说是解决这个问题的完美方式。

也许有人对 OPENCV 有更多的经验,可以照亮我解决这个问题的道路。谢谢你!

我的代码如下:

    import numpy as np 
    import cv2
    
    
    # Read the original image
    img = cv2.imread('test2.jpg') 
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_blur = cv2.GaussianBlur(img_gray, (3,3), 0) 
    
    
    edges = cv2.Canny(image=img_blur, threshold1=110, threshold2=180) # Canny Edge Detection
    ret, thresh = cv2.threshold(edges, 110, 180, cv2.THRESH_BINARY)
    
    contours, hierarchy = cv2.findContours(image=thresh, mode=cv2.RETR_TREE, method=cv2.CHAIN_APPROX_NONE)
    # print(contours)
    for  cnt in contours:
        print(cv2.arcLength(cnt, False))
    
    image_copy = img.copy()
    cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(255, 0, 0), thickness=1, lineType=cv2.LINE_AA)
    
    cv2.imshow('Binary image', image_copy)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()

结果

IMG1这是 OpenCV 当前检测到的

具有良好边缘检测的良好图像

IMG2我努力实现的良好边缘检测

完美的结果

IMG3在一张图像中结合了预期路径和缺陷的完美结果

原图

IMG4测试原图等

标签: pythonopencvcontour

解决方案


推荐阅读