본문 바로가기

[ 프로그래밍 ]/강좌

OpenCV 강좌 06. 마커 추출 (1) - 잡영 제거

본 장에서는 마커 추출을 위해 레이블의 크기정보를 토대로 잡영여부를 판단하고 이를 제거하는 방법을 소개한다.

1. 버튼 처리
- 단계적으로 결과를 보기 위한 체크박스 삽입

- 이진화를 해야 레이블링이 가능하고, 레이블링 이후에만 레이블링 통한 잡영 제거가 가능하도록 버튼 조작
(나중에 이런 부분들은 다 제거할 예정임.)

2. 레이블링 클래스에 잡영제거 루틴 추가

BlobSmallSizeConstraint(int nWidth, int nHeight)는 지정한 값 보다 작은 레이블들을 제거하고,
BlobBigSizeConstraint(int nWidth, int nHeight)는 지정한 값 보다 큰 레이블들을 제거한다.
각각의 함수는 클래스 내부에서 각각 _BlobSmallSizeConstraint()와 _BlobBigSizeConstraint()를 호출한다.


3. 제거 알고리즘의 작성(작은 레이블을 제거하는 루틴)

각각의 레이블들을 지정한 width와 height 값과 비교하여,
큰 값들은 temp에 저장하고, 작은값(잡영으로 판단한 값)을 가지는 레이블은 과감히 제낀다 -_-a
이후 temp의 내용을 원래 레이블 크기정보가 들어있던 rect에 옮겨 담음으로써 마무리된다.


4. 잡영 제거
- 영상의 80% 이상, 30px 이하의 레이블들은 모두 제거한다.

5. 테스트(이번 강좌는 동영상으로다가....)




강좌가 금방이라도 다 끝나버릴 것 처럼 빠르게 진행되고 있지만,
실제로는 사이사이 엄청나게 많은 고민과 변화가 필요하다.

예를들어, 지금은 단순히 OTSU의 이진화 방법을 이용하고 있지만,
조명의 영향을 덜 받기 위해 배경평면을 만들어 낸다던지,
이진화 기법을 개선하기 위해 Kmeans 알고리즘 등을 이용하여 추출률을 높힐 수 있다.
(실제로 번호판 문자의 추출에 본 알고리즘을 적용하여 사용하고 있다.)

또한, 레이블링 이후 검증 방법에서 가로세로 비율을 이용하여 잡영을 제거 한다던지,
적당한 크기를 미리 정하여 휴리스틱하게 맞춰가는 방법 등도 고려할 수 있다.


잘하려고 하면 한도 끝도 없고,
본 강좌의 목적이 학문적인 접근 보다는
간단하게 따라하고 다양한 형태로 적용 및 응용 가능한 기법들을 소개 하는데 있으므로
계속해서 이정도 선에서 진도를 나가겠다는 사족과 함께 본 장의 강좌를 마무리한다.

다음장에서는 레이블 형태의 검증을 통해 최종적으로 마커를 추출하는 방법에 대해 알아본다.