python with opencv로 가능한 번호인식.
마침 python이 설치되어있으니 opencv와 나머지를 설치해보자.
>> pip3 install opencv-python
문자인식 라이브러리 설치
>> pip3 install pytesseract
준비가 매우 간단하게 되었다.
영상에서 번호인식에 필요한 처리를 하기 위해 필요한 기능들을 먼저 살펴보는 것이 좋겠다.
영상처리 용어도 많아서 정리하는 것이 도움이 될 것 같다.
1. 이미지를 grayscale로 만들기
grayscale 말그대로 이미지를 gray, 회색빛으로 만드는 작업이다.
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
opencv의 cvtColor 함수 : 컬러모드를 변환해주는 함수.
일반적으로 알고 있는 컬러모드는 RGB인데, YCrCb, 등등의 다른 모드도 있다.
cvtColor는 그 모드를 변환해주는 함수이고, 여기서는 여러 모드 중 gray scale이 필요하다.
2. 가우시안블러(Gaussian Blur) 필터 적용하기
이미지를 흐릿하게 만드는 작업이다.
번호인식은 선명해야 잘 되는게 아닌가? 이걸 왜 할까? - 가우시안 블러링을 이해하면 해결된다.
다음단계가 엣지검출인데, 이 필터를 적용하고 나면 엣지검출이 잘 된다고 한다.
의문이 들지만 정리는 해본다.
img = cv2.GaussianBlur(img,(3,3),0)
첫번째 인자는 변환할 이미지.
가우시안 블러링을 알기 위해선 몇가지 선행으로 알아야할 개념이 필요한 것으로 보인다.
컨볼루션(convolution) : 이미지에 마스크를 적용하여 블러링 혹은 샤프닝 처리를 할 수 있다.
이 때 마스크는 커널 이라고 부르나보다. OS의 커널 아님.
예를 들어 보자면,
opencv로 영상 frame을 읽어서 print찍었을 때 아래와 같이 나온다.
픽셀값이 RGB순서로 나열되어있다.
컨볼루션은 각 픽셀값에 blur나 sharpness에 따라 정해진 커널(마스크)값을 씌우는 작업인 것이다.
블러링도 여러가지 방법이 있다고 하는데, 이 중에서 가우시안 블러링을 사용하는 이유를 알아보자.
블러링은 전체 픽셀값을 평균화시켜서 선명함을 없애는 원리이다.
위의 옵션처럼(3,3)을 주면 주변 3x3 픽셀값의 평균을 내어 해당 픽셀의 값을 새로 주는것이 된다.
가우시안블러링의 경우 3x3 픽셀값에서 가운데있는 픽셀에 가중치를 좀 더 높게 주어 큰 값은 선명해지도록 만들어준다.
값이 크면 선명해지고 작으면 더 안보이게 만들어주기 때문에 이미지가 엣지검출에 유리하게 변하는 것이다~!
세번째 인자는 모르겠는데 걍 0넣으면 되나보다.(급귀찮)
3. 엣지검출하기
img=cv2.Canny(img,100,200)
인자 2,3은 각각 최소/최대 threshold값이다.
이 값을 조절해서 엣지를 검출해야 한다.
4. 다음은 컨투어(contour)찾기.
같은 에너지를 가지는 점들을 연결한 선이라고 한다.
에너지가 무슨 뜻이지? 이건 좀 찾아봐야겠다.
컨투어 : 동일한 색 또는 픽셀값을 가지고 있는 영역의 정보. 물체의 윤곽선, 외형 파악에 사용된다.
그럼 함수사용법을 알아보자.
내가 정리할 필요 없이 걍 이 사이트 읽어보는게 훨씬 정리 잘 되어있고 좋네!
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
일단 이렇게 사용하는 것인데 이미지를 넣고 옵션을 주면 된다.
리턴은 일단 찾은 컨투어들의 좌표라고 한다.
opencv에는 이를 원본위에 그릴 수 있도록 함수를 제공한다.
for cnt in contours :
cv2.drawContours(img, [cnt], 0, (255, 0, 0), 3)
두번째 인자는 컨투어값.
세번째 인자는 contours list type에서 몇번째 라인을 그릴것인지 라는데 0이면 되나?
네번째 인자는 컨투어를 표시할 색상 코드. 위 코드에선 RED로 표시한다.
마지막은 컨투어 라인의 두께값이라고 한다. 뭐 적당히 조절해서 쓰면 될것 같다.
4. rectangle 찾기
번호판에는 같은 크기의 글자들이 나란히 있기 때문에 rectangle들이 일렬로 서있다.
그래서 간격과 기울기 값을 판단하여 이것이 번호라는것을 구별해내야 한다.
제대로 하고나면 번호판만 추출이 될 것이다.
5. 문자인식
추출한 번호판에 대해 tesseract로 문자인식을 진행한다.
pytesseract.image_to_string(img.open('plate.jpg'), lang='kor')
print(pytesseract)
하면 인식된 번호가 나올 것이다.
직접 코드들을 구현하면서 번호인식을 진행한게 아니라, 하는 방법만 알아 본 것이기 때문에 위 내용이 모두 맞을지는 모르겠다.
이제 실제로 진행해봐야겠다. 다음에
'개발Study > 번호판인식' 카테고리의 다른 글
tesseract 트레이닝 (5) | 2021.01.10 |
---|---|
번호인식 실습 (0) | 2020.12.20 |
댓글