템플릿 매칭
- 입력 영상에서 작은 크기의 부분 영상 위치를 찾아내고 싶은 경우에 주로 템플릿 매치(template matching) 기법을 사용한다.
- 여기서 템플릿(template)은 찾고자 하는 대상이 되는 작은 크기의 영상을 의미한다.
- 아래 그림은 템플릿 매칭의 동작 방식이다.
- (a)와 같이 템플릿 영상을 입력 영상 전체 영역에 대해 이동하면서 템플릿 영상과 입력 영상 부분 영상과의 유사도(similarity) 또는 비유사도(dissimilarity)를 계산한다.
- 유사도를 계산할 경우에는 템플릿 영상과 비슷한 부분 영상 위치에서 값이 크게 나타나고, 반대로 비유사도를 계산할 경우 템플릿 영상과 비슷한 부분에서 값이 작게 나타난다.
https://drive.google.com/uc?id=1qJsnIUVp23jODXlw2rNbvn3q8qnFK-Ia
- OpenCV에서는 matchTemplate() 함수를 이용하여 템플릿 매칭을 수행할 수 있다.
- matchTemplate() 함수는 입력 영상 image에서 템플릿 영상 templ을 이용하여 템플릿 매칭을 수행하고 그 결과로 생성되는 유사도 맵 또는 비유사도 맵을 result 인자로 반환한다.
- 만약 image 영상의 크기가 W x H이고 templ 영상의 크기가 w x h 인경우, result 행렬의 크기는 (W-w+1) x (H-h+1)로 결정된다.
- matchTemplate() 함수에서 템플릿 영상과 입력 영상 간의 비교 방식은 method 인자로 설정할 수 있다. method인자는 TemplateMatchModes 열거형 상수 중 하나를 지정할 수 있다.
TemplateMatchModes |
설명 |
TM_SQDIFF |
제곱차 매칭 방법 |
$R(x, y) = \sum_{x', y'}(T(x', y') - I(x+x', y+y'))^{2}$ |
|
TM_SQDIFF_NORMED |
정규화된 제곱차 매칭 방법 |
$R(x, y) = { \sum_{x', y'}(T(x', y') - I(x+x', y+y'))^{2} \over \sqrt{\sum_{x', y'}T(x', y')^{2} \cdot \sum_{x', y'}I(x+x', y+y')^{2}} }$ |
|
TM_CCORR |
상관관계 매칭 방법 |
$R(x, y) = \sum_{x', y'}T(x', y') \cdot I(x+x', y+y')$ |
|
TM_CCORR_NORMED |
정규화된 상관관계 매칭 방법 |
$R(x, y) = { \sum_{x', y'}T(x', y') \cdot I(x+x', y+y') \over \sqrt{ \sum_{x', y'}T(x', y')^{2} \cdot I(x+x', y+y')^{2}}}$ |
|
TM_CCOEFF |
상관계수 매칭 방법 |
$R(x, y) = \sum_{x', y'}T'(x', y') \cdot I'(x+x', y+y')$ |
|
$T'(x', y') = T(x', y') - {1 \over w \cdot h} \cdot \sum_{x'', y''}T'(x'', y'')$ |
|
$I'(x+x', y+y') = I(x+x', y+y') - {1 \over w \cdot h} \cdot \sum_{x'', y''} I(x+x'', y+y'')$ |
|
TM_CCOEFF_NORMED |
정규화된 상관계수 매칭 방법 |
$R(x, y) = { \sum_{x', y'}T'(x', y') \cdot I'(x+x', y+y') \over \sqrt{\sum_{x', y'}T'(x', y')^{2} \cdot \sum_{x',y'}I'(x+x', y+y')^{2}} }$ |
|
- TM_SQDIFF는 제곱차(squared difference) 매칭 방법을 의미하며, 이 경우 두 영상이 완벽하게 일치하면 0이 되고, 서로 유사하지 않으면 0보다 큰 양수를 갖는다.
- TM_CCORR는 상관관계(correlation) 매칭 방법을 의미하며, 이 경우 두 영상이 유사하면 큰 양수가 나오고 유사핮 ㅣ않으면 작은 값이 나온다.
- TM_CCOEFF는 상관계수(correlation coefficient) 매칭 방법을 의미하며, 이는 비교할 두 영상을 미리 평균 밝기로 보정한 후 상관관계 매칭을 수행하는 방식이다. TM_CCOEFF 방법은 두 영상이 유사하면 큰 양수가 나오고 유사하지 않으면 0에 가까운 양수 또는 음수가 나온다.
- TM_SQDIFF, TM_CCORR, TM_CCOEFF 방법에 대해 영상의 밝기 차이 영향을 줄여 주는 정규화 수식이 된 TM_SQDIFF_NORMED, TM_CCORR_NORMED, TM_CCOEFF_NORMED 방법도 제공된다.
- TM_CCORR_NORMED 방법은 결과값이 0-1 사이의 실수로 나타나고, TM_CCOEFF_NORMED 방법은 -1에서 1사이의 실수로 나타난다. 두 방법 모두 결과가 1에 가까울 수록 매칭이 잘 되었음을 의미한다.
- 여러 매칭 방법 중에서 상관계수 매칭 방법이 좋은 결과를 제공하는 것으로 알려져 있다.
- 그러나 계산 수식이 복잡하고 실제 동작시 연산량이 많다는 점을 고려해야 한다.
- 제곱차 매칭 방법을 사용할 경우, result 결과 행렬에서 최솟값 위치를 가장 매칭이 잘 된 위치로 선택해야 한다.
- 반면 상관관계 또는 상관계수 매칭 방법을 사용할 경우에는 result 결과 행렬에서 최댓값 위치가 가장 매칭이 잘 된 위치이다.
- 참고로 result 행렬에서 최솟값 또는 최댓값 위치는 OpenCV의 minMaxLoc() 함수를 이용하여 알아낼 수 있다.
void template_matching()
{
Mat img = imread("circuit.bmp", IMREAD_COLOR);
Mat templ = imread("crystal.bmp", IMREAD_COLOR);
if (img.empty() || templ.empty())
{
cerr << "Image load failed!" << endl;
return;
}
img = img + Scalar(50, 50, 50);
Mat noise(img.size(), CV_32SC3);
randn(noise, 0, 10);
add(img, noise, img, Mat(), CV_8UC3);
Mat res, res_norm;
matchTemplate(img, templ, res, TM_CCOEFF_NORMED);
normalize(res, res_norm, 0, 255, NORM_MINMAX, CV_8U);
double maxv;
Point maxloc;
minMaxLoc(res, 0, &maxv, 0, &maxloc);
cout << "maxv: " << maxv << endl;
rectangle(img, Rect(maxloc.x, maxloc.y, templ.cols, templ.rows), Scalar(0, 0, 255), 2);
imshow("templ", templ);
imshow("res_norm", res_norm);
imshow("img", img);
waitKey(0);
destroyAllWindows();
}
- Note) 템플릿 매칭은 알고리즘 특성상 입력 영상이 최전되거나 크기가 변경되면 제대로 동작하지 않는다. 또한 찾고자 하는 템플릿 영사잉 다른 객체에 의해 가려져도 좋은 결과를 기대할 수 없다. 이런 경우에는 템플릿 매칭 방법보다는 특징점 매칭 기법을 사용하는 것이 낫다.
캐스게이드 분류기와 얼굴 검출
- OpenCV에서 제공하는 얼굴 검출 기능은 2001년 비올라(P. Viola)와 존스(M. Jones)가 발표한 부스팅(boosting) 기반의 캐스케이드 분류기(cascade classifier) 알고리즘 기반으로 만들어졌다.
- 비올라와 존스가 개발한 객체 검출 알고리즘은 기본적으로 다양한 객체를 검출할 수 있지만, 특히 얼굴 검출에 적용되어 속도와 정확도를 인정받은 기술이다.
- 비올라-존스 얼굴 검출 알고리즘은 기본적으로 영상은 24 x 24 크기로 정규화한 후, 유사-하르필터(Haar-like filter) 집합으로부터 특징 정보를 추출하여 얼굴 여부를 판별한다.
- 유사-하르 필터란 흑백 사각형이 서로 붙어 있는 형태로 구성된 필터이며, 24 x 24 영상에서 만들 수 있는 유사-하르 필터의 예는 아래 그림과 같다.
- 유사-하르 필터 형태에서 흰색 영역 픽셀 값은 모두 더하고, 검은색 영역 픽셀 값은 모두 빼서 하나의 특징 값을 얻을 수 있다.
- 사람의 정면 얼굴 형태가 전형적으로 밝은 영역(이마, 미간, 볼 등)과 어두운 영역(눈썹, 입술 등)이 정해져 있기 때문에 유사-하르 필터로 구한 특징 값은 얼굴을 판별하는 용도로 사용할 수 있다.
https://drive.google.com/uc?id=1Gh35-ZbQqRjn8pdwtxSx8RBz40Ktbq6w
- 그러나 24 x 24 크기에서 유사-하르 필터를 약 18만개 생성할 수 있고, 픽셀 값의 합과 차를 계산하는 것이 시간이 오래 걸린다는 점이 문제가 되었기 때문에 비올라와 존스는 에이다부스트(adaboost) 알고리즘과 적분 영상(integral image)를 이용하여 이 문제를 해결하였다.