C++ / OpenCV 번호판 인식
(대학생 프로젝트 정리)OpenCV를 활용하여 자동차 번호판 위치 인식하기.
대학생 때 진행한 OpenCV 프로젝트 입니다.
후배님이 질문을 주셔서 공유목적으로 다시 작성합니다.
프로세스만 간단히 정리해드리고 세부코드는 직접 작성하시는 방향으로 가이드 하였습니다.
* Rect를 자꾸 React라고 치고 수정..
개요
OpenCV와 관련된 간단한 공부 후에 익힌 라이브러리를 사용해보기 위하여 딥러닝 등의 기술은 따로 사용하지 않았습니다.
https://github.com/GaeTaeng/Cpp_OpenCV-CarNumber-Find
GitHub - GaeTaeng/Cpp_OpenCV-CarNumber-Find: C++_OpenCV+CarNumber Find
C++_OpenCV+CarNumber Find. Contribute to GaeTaeng/Cpp_OpenCV-CarNumber-Find development by creating an account on GitHub.
github.com
프로세스
* 간단히 어떤 방식으로 진행하는지만 기술하였으며, 자세한 코드는 직접 구현하셔야합니다.
Window Name :: Ori

예제로 삼은 자동차 번호판 입니다.
Window Name :: Gray -> GrayScale 작업

Threadshold작업 등에 편해지기 위하여 GrayScale로 변경하였습니다.
Window Name :: Gaussian -> GaussianBlur

GaussianBlur를 이용하여 주변 특징(잡티 등)을 가려내어 후에 작업을 할 시에 나타나지 않게 하였습니다.
* 세부 잡티 수치 조정 필요
Window Name :: Thresh -> adaptiveThreshold

adaptiveThreshold를 이용하여 완전한 흰색과 검은색으로 분리
Window Name :: Contours -> findContours, drawContours

findContours와 drawContours를 이용하여 윤곽선 생성
Window Name :: Bounding -> boundingRect

boundingRect를 이용하여 Mat에 있는 각각의 좌표들을 vector<Point>단위로 받아내어, 각 이어진 윤곽단위를 Rect로 만들어내어 화면에 표시
Window Name :: possible Countours

간단한 조건식의 이용하여 각 React 단위로 각 속성값을 이용하여 최소 숫자가 되기위한 조건을 지정하여 줌.
간단한 조건식(드래그) : (area >= MIN_AREA && (*iter).width >= MIN_WIDTH && (*iter).height >= MIN_HEIGHT && ratio <= MAX_RATIO)
Window Name :: Wow Box! -> find_chars()를 구현

find_chars()라는 함수를 구현하여 상단에서는 하나의 단일 Rect객체에 대한 조건으로 부여하였지만, find_chars()함수에서는 Rect와 Rect 간의 거리, 각도, 너비, 높이, 넓이 등의 비율에 대하여 자동차 번호판이 되기 위한 조건들을 지정하여 번호판이라고 예상할 수 있는 조건의 Rect들을 서로 연결시켜 Vector에 추가
Window Name :: TestPoss

마무리 되어진 정보들을 적용시켜 각 문자별로 Scalar(255, 0, 0)의 값(파랑)으로 Rect를 원본 이미지 위에 그림
Window Name :: NumberBoard

번호판의 가능성이 있는 Rect들이 합쳐진 원본 이미지에서 각 Rect들의 좌표값으로 연산을 진행하여, 해당 부분만 잘라냄