我正在使用Python和Opencv。我正在做一个用汽车摄像头识别车牌的项目。
我曾尝试使用Canny()
,但我仍然无法识别该牌照。
1)
首先,我将图像转换为灰度,增加颜色合约,最后将其转换为“边缘图像”< / p>
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)
但是,我仍然无法识别盘子。我正在寻求帮助如何检测车牌。谢谢。
答案 0 :(得分:1)
你可以使用凸包的最小边界矩形来计算&#34;矩形&#34;您的候选轮廓(在最新版本的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
然而,在你的情况下,这实际上是矫枉过正的,它足以使用多边形的区域 - 你区域内截止的多边形(cnts
中的前两个轮廓)可用于获取车牌周围的边界矩形。