본문 바로가기
Opencv

Opencv Template Matching

by 연원랑 2022. 6. 15.

Template Matching

- 이미지 Matching시 사용 하며 위치포인트와 스코어 계산이 가능합니다.

void InspectMatching()
{
	Mat sourceImage, templateImage;
	double minVal, maxVal, matchVal;
	Point minLoc, maxLoc, matchLoc;
	int nScore;
	cv::Rect rt;
	sourceImage = imread("MatchOrg.bmp");	
	templateImage = imread("MatchP.bmp");

	if (sourceImage.cols <= 10 || sourceImage.rows <= 10)//원본이미지 최소 크기 10 이상
		return;
	if (templateImage.cols <= 10 || templateImage.rows <= 10)//템플릿이미지 최소 크기 10 이상
		return;
	if (sourceImage.rows < templateImage.rows || sourceImage.cols < templateImage.cols)// 원본 이미지가 템플릿 이미지 보다 커야함
		return;
	if (sourceImage.channels() != templateImage.channels())//소스와 템플릿 채널이 틀린경우에도 리턴
		return;
        
	int nMatchMethod;
	Mat result;
    
	nMatchMethod = TM_CCOEFF_NORMED;//정규화된 상관계수 메칭 방법(시간이 가장 오래걸리지만 제일 정확함)
	matchTemplate(sourceImage, templateImage, result, nMatchMethod);//템플릿 매칭 실행	
	minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());//연산 결과가 저장된 이미지에서 스코어값과 위치 얻음
	if (nMatchMethod == TM_SQDIFF || nMatchMethod == TM_SQDIFF_NORMED)//매칭 방법에 따라 다름
	{
		matchVal = 1 - minVal;//스코어
		matchLoc = minLoc;//위치(좌상포인트)
	}
	else
	{
		matchVal = maxVal;//스코어
		matchLoc = maxLoc;//위치(좌상포인트)
	}

	nScore = (int)(matchVal) * 100;//스코어 백분율로 변경

	rt.x = matchLoc.x;//X좌표(좌)
	rt.y = matchLoc.y;//Y좌표(상)
	rt.width = templateImage.cols;//(너비)
	rt.height = templateImage.rows;//(높이)

	rectangle(sourceImage, rt, Scalar(0, 0, 255));//원본에 사각형 이미지 그리기
	cvtColor(result, result, COLOR_GRAY2BGR);//연산결과에 원을 컬러로 표시하기위해 모노에서 컬러로 변경
	circle(result, matchLoc, 3, Scalar(0, 0, 255));//matchLoc에 원 그리기

	imshow("templateImage", templateImage);	
	imshow("연산결과", result);
	imshow("결과", sourceImage);

	waitKey(0);
}

댓글