Opencv在Python中检测四边形

时间:2016-06-21 10:37:21

标签: python image opencv image-processing polygon

我正在使用Python 2.7和OpenCV 3.0。我正在做一个检测汽车牌照的项目。

我现在正在检查轮廓的顶点数量。如果有4个顶点(大约中的元素数量),那么它更可能是矩形 / 平行四边形 / 四边形

(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts=sorted(cnts, key = cv2.contourArea, reverse = True)[:10]

# loop over our contours
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    if len(approx) == 4 and ratio(approx):
        cv2.drawContours(image, [approx], -1, (0,255,0), 3)

我有两个带阵列的四边形。

enter image description here

但是,您可以看到,不规则多边形。这是数组:

[[[209 198]]

 [[466  94]]

 [[259 153]]

 [[247   1]]]

我在问我怎样才能省略不规则的四边形。谢谢

2 个答案:

答案 0 :(得分:1)

正如https://stackoverflow.com/users/4606294/user89161在评论Opencv detect quadrilateral in Python中所建议的那样 也许你可以在你的approx上添加一个测试,例如:

hull = cv2.convexHull(approx,returnPoints = False)
defects = cv2.convexityDefects(approx,hull)

sum_of_defects=0
for i in range(defects.shape[0]):
    s,e,f,d = defects[i,0]
    sum_of_defects=sum_of_defects+d

if sum_of_defects <= threshold:
    print "approx is convex"
else:
    print "approx is not convex"

你必须正确选择threshold,我会从threshold=3或类似的东西开始。理论上threshold应为零。

答案 1 :(得分:1)

注意:如果您知道多项式应该具有多少边,例如,如果要在图像中寻找凸四边形,则只需调用:

hull = cv2.convexHull(approx, returnPoints = False)

然后,在四边形的情况下,您只需要检查len(hull) == num_expected_sides

len(cv2.convexHull(approx, returnPoints = False)) == 4