Search
Duplicate

OpenCV로 배우는 영상 처리 및 응용/ 영상 처리 응용 사례 Ⅰ

2차원 히스토그램을 이용한 이미지 검색

영상 검색하는 방법은 크게 문자기반 검색방법(Text-Based Image Retrieval, TBIR)과 내용기반 검색 방법(Content-Based Image Retrieval, CBIR)로 구분할 수 있다.
이중 내용기반 검색방법은 영상의 색상, 질감, 모양과 같은 해당 영상 데이터의 특징을 자동으로 추출하여 검색에 이용한다.

2차원 히스토그램

크기가 다른 영상들에서 히스토그램을 계산하면 영상간의 히스토그램 빈도값이 동등하지 않게 된다. 즉, 크기가 큰 영상은 화소의 개수가 많아서 각 빈도값이 커지므로 영상간의 동등한 비교를 위해 계산된 히스토그램을 0~1 사이의 값으로 정규화한다.
아래 그림과 같이 2차원 히스토그램의 빈도 데이터는 색상(hue)와 채도(saturation)를 축으로 2차원의 좌표를 구성하고, 각각의 좌표에 색상과 채도를 연관지어 빈도가 계산된다.
이와 같은 2차원 히스토그램을 그림으로 표현하면, 2차원 행렬에서 x 좌표는 채도를 y 좌표는 색상을 나타내도록 하고, 빈도값을 그 좌표에서의 밝기로 지정할 수 있을 것이다.

유사도 비교

OpenCV에서 두 영상의 히스토그램이 얼마나 비슷한지를 비교해주는 함수가 cv::compareHist()이다.
비교 방식 옵션 중에서 CV_COMP_CORREL를 지정하면 다음의 수식으로 계산된 값을 반환한다. 이 수식은 상호상관 함수의 수식을 응용한 것으로서 두 히스토그램의 비슷한 정도를 나타낸다.
d(H1,H2)=i(H1(i)Hˉ1)(H2(i)Hˉ2)i(H1(i)Hˉ1)2(H2(i)Hˉ2)2d(H_{1}, H_{2}) = {\sum_{i}(H_{1}(i) - \bar{H}_{1}) (H_{2}(i) - \bar{H}_{2}) \over \sqrt{\sum_{i} (H_{1}(i) - \bar{H}_{1})^{2} \cdot (H_{2}(i) - \bar{H}_{2})^{2}}}

하르 분류기를 이용한 얼굴검출 및 성별 분류

하르 기반 분류기

2001년 Viola와 Jones는 객체 검출 분야에서 가장 대표적인 방법론으로 인정받는 논문 “Rapid Object Detection Using a Boosted Cascade of Simple Features”를 발표했다.
이 논문에서 얼굴과 얼굴이 아닌 것의 차이를 효율적으로 보여줄 수 있는 하르 유사 특징(Haar-like features)을 이용한 방법을 제안하였다.
하르 유사 특징은 하르 웨이브릿(Haar wavelet)과 유사하기 때문에 붙여진 이름으로서 아래 그림과 같이 위치, 모양, 크기에 따라 다양한 형태로 구성되어 있다. 그 특징값은 흰색 영역의 화소값의 합과 검음색 직사각형 영역의 화소값의 합의 차로 정의된다.
하르 기반 캐스케이드 분류기는 하르 유사 특징과 같은 매우 단순한 특징들을 조합하여 객체를 찾아낸다. 캐스케이드(cascade)란 용어에서 알 수 있듯, 여러 개의 검출기를 순차적으로 사용한다.
처음에 간단한 검출기를 적용하고, 진행할 수록 복잡한 검출기를 적용한다.
따라서 단순 검출기를 통과한 후보에만 시간이 많이 걸리는 강력한 검출기가 적용되기 때문에 검출 속도를 크게 향상시킬 수 있다.
OpenCV의 캐스케이드 분류기는 1,000개 이상의 얼굴 영상과 10,000개 이상의 얼굴이 아닌 영상을 사용하여 학습되었다.
이 과정은 일반적인 멀티코어 CPU를 장착한 컴퓨터에서 최대 1주일 정도의 시간이 소요되는데, 다행히 OpenCV에서 미리 학습된 다양한 검출기를 제공한다.
따라서 필요한 종류의 Cascade 분류기 파일을 로드함녀 검출기를 사용하여 분류할 수 있다. 이를 통해 전면 얼굴, 옆면 얼굴, 눈, 코 등을 검출할 수 있다.
OpenCV의 \sources\data\harrcascades\ 폴더에 xml 파일로 된 다양한 하르 기반 검출기가 있다.
(이하 예제 코드 설명 내용 생략)