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);
}
'Opencv' 카테고리의 다른 글
Opencv Threshold 설명 (0) | 2023.02.17 |
---|---|
Opencv 이미지 전처리2(Sharpness, Rotate, MeasureFocus) (0) | 2022.06.15 |
Opencv 이미지 전처리1(Sobel, Canny, Erode, Dilate) (0) | 2022.06.15 |
Opencv convert type (Mat to iplimage, iplimage to Mat) (0) | 2022.06.15 |
댓글