2016-08-22 3 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' и' rectangleeness' достаточно хорошо обнаружить прямоугольник? – VICTOR

+0

в вашем случае вам даже не нужна прямоугольность, вы можете просто использовать область – maxymoo

+0

Я использовал этот метод раньше, однако иногда я обнаруживаю некоторую не-четырехугольную форму. Чтобы отфильтровать эту не-четырехугольную или неправильную форму, я использую 'len (hull) == 4', чтобы определить – VICTOR