您的位置:首页 > 运维架构

【opencv练习31 - 模板匹配】

2016-09-09 07:58 429 查看
/*******************************************************
测试程序【模版匹配】
时间:2016年9月3日
//参数 输入I ,模板T , 结果 R ,匹配方法
matchTemplate( img, templ, result, match_method );
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

********************************************************/

//【全局变量】
Mat img; Mat templ; Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";

int match_method;
int max_Trackbar = 5;

void MatchingMethod( int, void* );

int main(void)
{
img = imread("lab.jpg", 1 );
templ = imread("juice.jpg", 1 );

namedWindow( image_window, WINDOW_AUTOSIZE );
namedWindow( result_window, WINDOW_AUTOSIZE );

const char* trackbar_label =
"Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );

MatchingMethod( 0, 0 );

waitKey(0);
return 0;
}

void MatchingMethod( int, void* )
{
//【1、源图片,待显示】
Mat img_display;
img.copyTo( img_display );

//【2、创建结果矩阵】
int result_cols =  img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create( result_cols, result_rows, CV_32FC1 );

//【3、匹配&归一化】
//参数 输入I ,模板T , 结果 R ,匹配方法
matchTemplate( img, templ, result, match_method );
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

//【定位最佳匹配】
double minVal;
double maxVal;
Point minLoc;
Point maxLoc;
Point matchLoc;

minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

// 【CV_TM_SQDIFF 平方差匹配】:用平方差来进行匹配;
//最好的匹配值为0;匹配越差,匹配值越大。
// 【CV_TM_CCORR 相关匹配】 :采用乘法操作;数值越大表明匹配越好。
// 【CV_TM_CCOEFF 】      :相关系数匹配:1完美匹配;-1最差匹配。
// 【CV_TM_SQDIFF_NORMED 】 :归一化平方差匹配法
// 【CV_TM_CCORR_NORMED  】 :归一化相关匹配法
// 【CV_TM_CCOEFF_NORMED 】 :归一化相关系数匹配法

//【对于,平方差匹配,相关匹配 越低越好】
//【其他的,越高越好 】

if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
{ matchLoc = minLoc; }
else
{ matchLoc = maxLoc; }  //MAX

// Show
rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );

imshow( image_window, img_display );
imshow( result_window, result );

return;
}










内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息