我正在使用Python和Opencv。我正在做一个从车载摄像头识别车牌的项目。

我尝试使用Canny(),但是我仍然无法识别盘子。

这是我捕获的帧。
python - 车载摄像头检测车牌-LMLPHP

1)

首先,将图像转换为灰度级,增加颜色的契约(Contract),最后将其转换为“边缘图像

img = cv2.imread("plate.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
edged = cv2.Canny(gray, 200, 255)

这是我得到的结果:
python - 车载摄像头检测车牌-LMLPHP

2)

之后,我尝试按以下方式找到矩形轮廓,尝试按面积和长度过滤出不相关的矩形,并通过convexHull()过滤出不规则多边形:
(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
plate_candidates = []
    for c in cnts:
        peri = cv2.arcLength(c, True)
        approx = cv2.approxPolyDP(c, 0.02 * peri, True)
        area = cv2.contourArea(approx)
        if len(approx) == 4 and area <=1000 and area >=500 and self._length_checking(approx):
            hull = cv2.convexHull(approx,returnPoints = True)
            if len(hull) ==4:
                plate_candidates.append(approx)
                cv2.drawContours(show, [approx], -1, (0,255,0), 3)

但是,我仍然无法认出那个盘子。我正在寻求帮助,如何检测车牌。谢谢。

最佳答案

您可以使用凸包的最小边界矩形来计算候选轮廓的“矩形度”(在最新版本的openCV中,您可以使用cv2.boxPoints来计算rectPoints):

def rectangleness(hull):
    rect = cv2.boundingRect(hull)
    rectPoints = np.array([[rect[0], rect[1]],
                           [rect[0] + rect[2], rect[1]],
                           [rect[0] + rect[2], rect[1] + rect[3]],
                           [rect[0], rect[1] + rect[3]]])
    intersection_area = cv2.intersectConvexConvex(np.array(rectPoints), hull)[0]
    rect_area = cv2.contourArea(rectPoints)
    rectangleness = intersection_area/rect_area
    return rectangleness

但是,在您的情况下,这实际上是矫kill过正,只需使用多边形的面积即可—您可以使用区域边界内的任意一个多边形(cnts中的前两个轮廓)来获取车牌周围的边界矩形。

10-08 15:33