안녕하세요! 오늘은 tesseract를 이용하여 자동차 번호판을 인식하는 방법입니다.
준비과정이 필요하신 분들은 전 글을 참고하시면 됩니다.
˙ 코드 및 실행 결과
전체 코드는 더 많은 내용을 담고 있기 때문에 대략적으로 간단히만 설명 드리겠습니다. 전체 코드는 아래 깃허브에서 확인하실 수 있습니다.
github.com/dpwls64/tesseract_project
1. 자동차 번호판 위치 알아내기
- 원본 이미지
- 이미지 흑백화
gray = cv2.cvtColor(img_ori, cv2.COLOR_BGR2GRAY)
- 가우시안 블러 : 노이즈 줄이기
img_blurred = cv2.GaussianBlur(gray, ksize=(5, 5), sigmaX=0)
- 스레시 홀드 : 이미지 구별 쉬움 (흑색, 흰색)
img_thresh = cv2.adaptiveThreshold(
img_blurred,
maxValue=255.0,
adaptiveMethod=cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
thresholdType=cv2.THRESH_BINARY_INV,
blockSize=19,
C=9
)
가우시안 블러를 이용하여 이미지를 흐릿하게 만들어 노이즈를 줄여주고,
스레시 홀드를 이용하여 이미지를 검정색, 흰색으로만 표현하여 컴퓨터가 구별하기 쉽게 만들어 줍니다.
- 윤곽선 찾기
contours, _ = cv2.findContours(
img_thresh,
mode=cv2.RETR_LIST,
method=cv2.CHAIN_APPROX_SIMPLE
)
- 윤곽선 중 사각형 찾기
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(temp_result, pt1=(x, y), pt2=(x+w, y+h), color=(255, 255, 255), thickness=2)
찾은 사각형 중에서 점차적으로 번호판과 가깝다고 생각하는 사각형들을 찾습니다.
- 번호판 각도 돌리기
rotation_matrix = cv2.getRotationMatrix2D(center=(plate_cx, plate_cy), angle=angle, scale=1.0)
img_rotated = cv2.warpAffine(img_thresh, M=rotation_matrix, dsize=(width, height))
비뚤어져 있는 번호판을 일자로 되도록 돌리고, 이미지를 더 선명하게 해줍니다.
2. 번호판 글자 인식하기 (tesseract)
chars = pytesseract.image_to_string(img_result, lang='kor', config='--psm 7 --oem 0')
result_chars = ''
has_digit = False
for c in chars:
if ord('가') <= ord(c) <= ord('힣') or c.isdigit():
if c.isdigit():
has_digit = True
result_chars += c
숫자와 한글로 이미지를 인식하여 결과를 추출합니다.
'코딩 기록 > PYTHON' 카테고리의 다른 글
[Python] 파이썬으로 오라클 데이터베이스 가져오기 (0) | 2021.04.27 |
---|---|
[Python] 네이버 이메일 보내기 (0) | 2021.04.23 |
[Python] tesseract를 이용한 자동차 번호판 인식기 - 1 (0) | 2021.04.01 |
[Python] selenium을 이용한 웹 크롤링 (0) | 2021.03.29 |
[Python] Flask를 이용하여 카카오페이 API 사용하기 (0) | 2021.03.27 |