我正在使用Python和Opencv。我正在做一个从车载摄像头识别车牌的项目。
我尝试使用Canny()
,但是我仍然无法识别盘子。
这是我捕获的帧。
1)
首先,将图像转换为灰度级,增加颜色的契约(Contract),最后将其转换为“边缘图像”img = cv2.imread("plate.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
edged = cv2.Canny(gray, 200, 255)
这是我得到的结果:
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
中的前两个轮廓)来获取车牌周围的边界矩形。