首页 > 解决方案 > 如何使用轮廓来检测具有 1 个不均匀边的矩形?

问题描述

这是矩形:

我想检测这个的原因是因为我试图检测图像中的交通灯箱。当我查看某些图像的边缘图时,交通灯的下边缘可能会失真或不均匀,这导致我的轮廓算法无法检测到框。

红绿灯:

标签: opencvimage-processingcontour

解决方案


基本上,无论物体的形状如何,您都可以找到物体的轮廓。在你的情况下,我找到最大的轮廓(绿色),然后得到它的边界矩形(红色)。

imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)

im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for i,c in enumerate(contours):
    area = cv2.contourArea(c)
    #remove small contours and too big contours
    if area > 500 and area < 30000:
        rect = cv2.boundingRect(c)
        cv2.drawContours(img, contours, i ,(0,255,0), 1)
        cv2.rectangle(img,(rect[0],rect[1]),(rect[0]+rect[2],rect[1]+rect[3]),(0,0,255),2)

在此处输入图像描述

但我认为在现实生活中,你永远不会得到如此高分辨率的红绿灯,因此找到它们可能会更加复杂。我建议在提取轮廓之前使用一些预处理技术,例如 sobelx、threshold、morphologyEx、...。您还需要找到合适的条件,例如比率检查、面积检查……来过滤这些轮廓以获得正确的交通灯。


推荐阅读