void CPracticeDlg::OnButton8() // 템플릿
{
IplImage* src=cvLoadImage("1.jpg",1);
IplImage* src2=cvLoadImage("3.jpg",1);
IplImage* dst_image=cvCreateImage(cvSize(src->width-src2->width+1,src->height-src2->height+1),IPL_DEPTH_32F,0);
IplImage* dst2=cvCloneImage(src);
IplImage* frame_copy2 = cvCreateImage( cvSize(src->width,src->height),
IPL_DEPTH_8U, src->nChannels );
IplImage* frame_copy = cvCreateImage( cvSize(src->width,src->height),
IPL_DEPTH_8U, src->nChannels );
if( src->origin == IPL_ORIGIN_TL ) { //Top-Left Origin
cvCopy( src, frame_copy2, 0 );
cvCopy( src, frame_copy, 0 );
}else{
cvFlip( src, frame_copy2, 0 );
cvFlip( src, frame_copy, 0 );
}
// 이미지를 복사한다. cvCloneImage
// 이미지의 설정내용을 가져온다. cvCreateImage
//상관계수를 이용하여 템플릿 매칭
cvMatchTemplate(src,src2,dst_image,CV_TM_CCOEFF_NORMED);
double min_val, max_val;
CvPoint max_val_pos, pos;
cvMinMaxLoc(dst_image, &min_val, &max_val, NULL, &max_val_pos); // 유사도가 최대인 위치 얻음
/*MinMaxLoc
Finds global minimum and maximum in array or subarray
void cvMinMaxLoc( const CvArr* A, double* minVal, double* maxVal,
CvPoint* minLoc, CvPoint* maxLoc, const CvArr* mask=0 );
A
The source array, single-channel or multi-channel with COI set.
minVal
Pointer to returned minimum value.
maxVal
Pointer to returned maximum value.
minLoc
Pointer to returned minimum location.
maxLoc
Pointer to returned maximum location.
mask
The optional mask that is used to select a subarray.
*/
pos.x = max_val_pos.x + src2->width;
pos.y = max_val_pos.y + src2->height;
int aa,bb,result_x,result_y;
aa=pos.x - max_val_pos.x;
bb=pos.y - max_val_pos.y;
result_x=aa/5;
result_y=bb/5;
CvPoint po;
po.x=max_val_pos.x+result_x;
po.y=max_val_pos.y+result_y;
IplImage* roi_image=cvCreateImage(cvSize(src2->width, src2->height),
src2->depth, src2->nChannels );
CvRect rect = {max_val_pos.x, max_val_pos.y, src2->width, src2->height};
cvSetImageROI(frame_copy2, rect);
IplImage* roi_image2=cvCreateImage(cvSize(result_x, result_y),
src2->depth, src2->nChannels );
CvRect rect2 = {max_val_pos.x, max_val_pos.y, result_x, result_y};
cvSetImageROI(frame_copy, rect2);
cvResize (frame_copy2, roi_image, CV_INTER_LINEAR);
cvResize (frame_copy, roi_image2, CV_INTER_LINEAR);
cvRectangle(dst2, max_val_pos, pos, CV_RGB(255,0,0));
cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
cvShowImage("src", src);
cvNamedWindow("template", CV_WINDOW_AUTOSIZE);
cvShowImage("template", roi_image2);
cvNamedWindow("dest", CV_WINDOW_AUTOSIZE);
cvShowImage("dest", roi_image);
cvNamedWindow("found region", CV_WINDOW_AUTOSIZE);
cvShowImage("found region", dst2);
cvReleaseImage(&src);
cvReleaseImage(&roi_image2);
cvReleaseImage(&roi_image);
cvReleaseImage(&dst2);
}
결과....
컬러코드이미지가 잡혔다는 가정하에...쉽게 탬플릿으로 일단 잡고.
원본에서 잡은 컬러코드의 위치를 찾아..원도우에 나타내고..
인식한 컬러코드를 5*5 분활하여 다른 원도우로 나타냄...
즉 D11의 색이 지금 초록인데...결과값을 보면 원도우에
초록색만 잡혀져 있다...
int aa,bb,result_x,result_y;
aa=pos.x - max_val_pos.x;
bb=pos.y - max_val_pos.y;
result_x=aa/5;
result_y=bb/5;
CvPoint po;
po.x=max_val_pos.x+result_x;
po.y=max_val_pos.y+result_y;
이식 수식을 늘려 총 25개의 영역을 나눌 것이다...
좀더 간단한 수식으로는 안될까??? 흠