목표
이미지 개체를 찾으려면 Template matching을 사용한다
- 사용되는 함수 cv.match Template()
void matchTemplate
(
InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask = noArray()
)
겹친 이미지 영역과 템플릿을 비교한다. 이 함수는 image를 슬라이드하고 지정된 방법을 사용하여 w×h 크기의 겹친 패치를 templ과 비교하고 비교 결과를 결과에 저장한다.
TemplateMatchModes는 사용 가능한 비교 방법에 대한 공식을 설명한다 (I는 이미지, T 템플릿, R 결과, M은 선택적 마스크). 합산(summation)은 템플릿 또는 이미지 패치 (x ′ = 0 ... w−1, y ′ = 0 ... h−1)에 대해 수행된다.
함수가 비교를 마친 후 가장 일치하는 항목은 minMaxLoc 함수를 사용하여 전역 최소값 (TM_SQDIFF 사용시) 또는 최대 값 (TM_CCORR 또는 TM_CCOEFF 사용시)으로 찾을 수 있다. 컬러 이미지의 경우 분자의 템플릿 합산과 분모의 각 합이 모든 채널에 대해 수행되고 각 채널에 대해 별도의 평균 값이 사용된다. 즉, 함수는 컬러 템플릿과 컬러 이미지를 취할 수 있습니다. 결과는 분석하기 더 쉬운 단일 채널 이미지가 된다.
image | 검색이 실행되는 이미지이기 때문에 8bit 또는 32bit 부동 소수점이어야한다. |
templ | 검색된 템플릿. 소스 이미지보다 크지 않아야하며 데이터 유형이 동일해야한다. |
result | Map of comparison results. 단일 채널 32bit 부동 소수점이어야한다. 영상이 W×H이고 templ이 w×h이면 결과는 (W-w + 1) × (H-h + 1)입니다. |
method | 비교 방법을 지정하는 매개 변수, TemplateMatchModes 내용 참조 |
mask | 선택적 마스크. templ과 크기가 같아야한다. 템플릿과 동일한 수의 채널이 있거나 하나의 채널 만 있어야 모든 템플릿 및 이미지 채널에 사용된다. 데이터 유형이 CV_8U 인 경우 마스크는 이진 마스크로 해석된다. 즉, 마스크가 0이 아닌 요소 만 사용되며 실제 마스크 값과 관계없이 변경되지 않고 유지(가중치=1)된다. 데이터 파일 CV_32F의 경우 마스크 값이 가중치로 사용된다. |
- 사용되는 함수cv.minMaxLoc()
void minMaxLoc
(
InputArray src,
double * minVal,
double * maxVal = 0,
Point * minLoc = 0,
Point * maxLoc = 0,
InputArray mask = noArray()
)
배열에서 전역 최소값과 최대 값을 찾습니다. minMaxLoc 함수는 최소 및 최대 요소 값과 해당 위치를 찾습니다. 극한값은 전체 array 또는 마스크가 텅빈 array가 아닌 경우 지정된 array 영역에서 검색된다.
이 기능은 다중 채널 배열에서 작동하지 않는다. 모든 채널에서 최소 또는 최대 요소를 찾아야하는 경우 먼저 Mat :: reshape를 사용하여 배열을 단일 채널로 재 해석해야한다. 또는 extractImageCOI, mixChannels 또는 split을 사용하여 특정 채널을 추출 할 수 있다.
src | 입력 단일 채널 배열. |
minVal | 반환 된 최소값에 대한 포인터; 필요하지 않은 경우 NULL이 사용됩니다. |
maxVal | 반환 된 최대값에 대한 포인터; 필요하지 않은 경우 NULL이 사용됩니다. |
minLoc | 반환 된 최소 위치에 대한 포인터 (2D 경우) 필요하지 않은 경우 NULL이 사용됩니다. |
maxLoc | 반환 된 최대 위치에 대한 포인터 (2D 경우) 필요하지 않은 경우 NULL이 사용됩니다. |
mask | 하위 배열을 선택하는 데 사용되는 선택적 마스크입니다. |
void minMaxLoc
(
const SparseMat & a,
double * minVal,
double * maxVal,
int * minIdx = 0,
int * maxIdx = 0
)
편의를 위해 제공되는 오버로드 된 멤버 함수이다. 위의 함수와는 어떤 인수를 허용하는지 만 다르다.
a | 입력 단일 채널 배열. |
minVal | 반환 된 최소값에 대한 포인터; 필요하지 않은 경우 NULL이 사용된다. |
maxVal | 반환 된 최대 값에 대한 포인터; 필요하지 않은 경우 NULL이 사용된다. |
minIdx | 반환 된 최소 위치에 대한 포인터 (nD 경우) 필요하지 않은 경우 NULL이 사용된다. 그렇지 않으면 src.dims 요소의 배열을 가리켜 야하며 각 차원에서 최소 요소의 좌표가 순차적으로 저장된다. |
maxIdx | 반환 된 최대 위치에 대한 포인터 (nD 경우). 필요하지 않은 경우 NULL이 사용된다. |
- TemplateMatchModes
CV_TM_SQDIFF (각 픽셀의 제곱의 차이)

CV_TM_SQDIFF_NORMED (CV_TM_SQDIFF / sqrt(각 픽셀의 제곱의 곱))

CV_TM_CCORR (각 픽셀의 곱의 합 (교차 상관))

CV_TM_CCORR_NORMED (CV_TM_CCORR / sqrt(각 픽셀의 제곱의 곱))

CV_TM_CCOEFF (상관계수)

CV_TM_CCOEFF_NORMED (CV_TM_CCOEFF / sqrt(각 픽셀의 제곱의 곱))

'C & C++ > [정리] OpenCV4로 배우는 컴퓨터 비전과 머신러닝' 카테고리의 다른 글
[OpenCV4] 영상의 필터링(Filtering)_엠보싱 필터링 (0) | 2021.06.09 |
---|---|
[OpenCV4] 영상의 필터링(Filtering)_필터링 연산 방법 (0) | 2021.06.07 |
[OpenCV4] 영상의 산술 및 논리 연산_영상의 논리 연산 (0) | 2021.06.01 |
[OpenCV4] 영상의 산술 및 논리 연산_영상의 산술 연산 (0) | 2021.05.31 |
[OpenCV4] 히스토그램 분석_히스토그램 평활화 (0) | 2021.05.27 |