2016-08-22 130 views
2

我正在使用Python和Opencv。我正在做一個項目來識別汽車攝像頭的車牌。車牌照檢測車牌攝像頭

我試過使用Canny(),但我仍然無法識別板。

這是我拍攝的框架。 enter image description here

1)

首先,我將圖像轉換爲灰度,增加顏色的合同並最終將其轉換成 「一柄圖像

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

這裏是我得到的結果: enter image description here

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) 

但是,我仍然無法辨認板子。我正在尋找幫助,我如何檢測車牌。謝謝。

回答

1

您可以使用凸包來計算你的候選輪廓的「rectangleness」的最小邊界矩形(在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中的前兩個輪廓)來獲取車牌周圍的邊界矩形。

+0

感謝您的回覆。你的意思是我使用的限制太嚴格了嗎?通過使用'area'和'rectangleness'就足以檢測矩形? – VICTOR

+0

在你的情況下,你甚至不需要矩形,你可以使用區域 – maxymoo

+0

我以前使用過這種方法,但是,有時我會檢測到一些非四邊形的形狀。爲了過濾掉這些非四邊形或不規則形狀,我使用'len(hull)== 4'來確定 – VICTOR