본문 바로가기
개발Study/번호판인식

번호인식 실습

by happy90 2020. 12. 20.
SMALL

그럼 실습!

차량 이미지를 하나 준비한다.

1. Grayscale로 만들어준다.

img2=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

 

2. 윤곽선을 잘 잡을 수 있도록 가우시안 블러 적용

img2=cv2.GaussianBlur(img2,(3,3),0)

 

3. 엣지검출

img2=cv2.Canny(img2,100,200)

 

4. 컨투어를 찾아 rectangle의 형태로 그린다.

contours, hierarchy = cv2.findContours(img2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    x,y,w,h = cv2.boundingRect(contour)
    cv2.rectangle(img, pt1=(x,y), pt2=(x+w, y+h), color=(0,255,0), thickness=1)

green으로 그렸다.

원본 이미지에다 그렸더니 이렇게 되었다. 으어ㅓㅓㅓ 환공포증

 

여기서 불필요한 rectangle을 지워야 한다.

적당히 크기가 너무 크거나 너무 작은 것들은 그리지 않도록 코드를 수정한다.

h>w는 가로로 길쭉한것들을 배제하기 위함.

img_w, img_h, img_ch = img.shape
space = img_w * img_h
min_space = space/3000  # 2000 < value() < 3000
max_space = space/200   # 100 < value(200) < 500

contourlist=[]
for i, contour in enumerate(contours):

    x,y,w,h = cv2.boundingRect(contour)
    
    if w*h > min_space and w*h < max_space and h > w :
        cv2.rectangle(img, pt1=(x,y), pt2=(x+w, y+h), color=(0,255,0), thickness=1)
        contourdict = {
            'contour' : contour,
            'x' : x,
            'y' : y,
            'w' : w,
            'h' : h,
            'cx' : x+w/2,
            'cy' : y+h/2,
        }
        contourlist.append(contourdict)

 

이제 좀 봐줄만해졌다만.. 이 사진, 고난이도인게 아닐까? 좀많이...

뒤의 벽 무늬도 그렇고 창문도 그렇고. 타이어 무늬까지.

 

겹쳐져있는 사각형들을 제거해야할 것 같다.

 

 

일단 번호판을 보면 각 글자들이 예쁘게 사각형으로 감싸져 있다.

여기서 rectangle들의 거리나 기울기가 일정한 것을 찾아내면 번호판의 글자들만 추려낼 수 있을 것이다.

(추려낼 수 있도록 알고리즘을 구현해야 하는 것임.)

각 rectangle이 다른 rectangle로부터 얼마나 떨어져있는지, 기울기는 어떻게 되는지 측정하여 불필요한 것을 걸러낸다.

 

기울기를 계산하여 각 기울기별 가산점을 달리 주면 찾을 수 있지 않을까.

(x좌표간 거리가 너무 멀면 아예 제외시켰다.)

이렇게 해서 가산점이 큰 20개만 추렸다. (10개로 추리면 번호에서 벗어나버림 ;;)

거의 다 된 것 같다.

 

양옆 rectangle 사이의 거리를 재서 가까우면 점수를 주고, 멀면 낮게주어 필터링했다. 드디어 성공했다...

 

 

약간 여유를 주어 추출한 번호판 이미지.

이제는 tesseract를 이용하여 번호인식을 해본다.

어우짜증나 정말 무슨 환경을 잘못설치해서 이래된거야.... 

tesseract 윈두에서 사용하려면 윈도우버전을 설치한 후 커맨트 설정을 해주어야 한다는걸 뒤늦게 알음.

 

문자인식 결과 :

하...욕나온다. 전기차번호판이라 그런것일까? 파란배경이라서.

 

grayscale로변경후 다시 시도.

지친다. 다음에는 이 번호판을 수평으로 맞춰놓고 해봐야겠다.

 

번호판을 수평으로 놓아보자.

rotate시킨건데 이건 인식이 더 안됨.

아..촴놔....

 

코드도 올려야겠는데 정리가안된다...

LIST

'개발Study > 번호판인식' 카테고리의 다른 글

tesseract 트레이닝  (5) 2021.01.10
번호인식 준비하기  (0) 2020.12.05

댓글