目录
1--模板匹配
1-1--OpenCV API
1-2--六种匹配方法
1-3--代码实例
2--最值计算
2-1--OpenCV API
使用模板图像与原图像进行匹配,OpenCV提供了相应的模板匹配函数cv::matchTemplate(),并支持六种模板匹配方法。
void cv::matchTemplate(cv::InputArray image, cv::InputArray templ, cv::OutputArray result, int method, cv::InputArray mask = noArray())
// cv::InputArray image:原图像
// cv::InputArray templ:模板图像
// cv::OutputArray result:匹配结果图
// int method:使用的方法
// cv::InputArray mask = noArray():输入的掩码图像,一般为空
① cv::TemplateMatchModes::TM_SQDIFF;
② cv::TemplateMatchModes::TM_SQDIFF_NORMED;
③ cv::TemplateMatchModes::TM_CCORR;
④ cv::TemplateMatchModes::TM_CCORR_NORMED;
⑤ cv::TemplateMatchModes::TM_CCOEFF;
⑥ cv::TemplateMatchModes::TM_CCOEFF_NORMED;
具体公式讲解可参考博客1
# include
# include
# include
cv::Mat src1, src2, dst;
int Method = cv::TemplateMatchModes::TM_SQDIFF;
int Max_track = 5;
void Match_Demo(int, void*){
// 初始化结果图
int width = src1.cols - src2.cols + 1;
int height = src1.rows - src2.rows + 1;
cv::Mat result(width, height, CV_32FC1);
// 匹配
cv::matchTemplate(src1, src2, result, Method, cv::Mat());
cv::normalize(result, result, 1, 0, cv::NORM_MINMAX, -1, cv::Mat());
cv::Point minLoc, maxLoc;
double min, max;
cv::Point temLoc;
cv::minMaxLoc(result, &min, &max, &minLoc, &maxLoc, cv::Mat());
// 根据匹配结果确定最佳的位置,不同的方法对应的最佳位置不同,例如 TM_SQDIFF 像素值最小(黑色)的地方对应最佳的位置
if (Method == cv::TemplateMatchModes::TM_SQDIFF || Method == cv::TemplateMatchModes::TM_SQDIFF_NORMED){
temLoc = minLoc;
}
else{
temLoc = maxLoc;
}
// 绘制矩形
src1.copyTo(dst);
cv::rectangle(dst, cv::Rect(temLoc.x, temLoc.y, src2.cols, src2.rows), cv::Scalar(0, 0, 255), 2, 8);
cv::rectangle(result, cv::Rect(temLoc.x, temLoc.y, src2.cols, src2.rows), cv::Scalar(0, 0, 255), 2, 8);
cv::imshow("output", result);
cv::imshow("match", dst);
}
int main(int argc, char** argv){
src1 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/test1.jpg"); // 待检测图片
src2 = cv::imread("C:/Users/Liujinfu/Desktop/opencv_bilibili/match.jpg"); // 模板图片
if (src1.empty() || src2.empty()){
printf("could not load image..\n");
return -1;
}
cv::imshow("input1", src1);
cv::imshow("input2", src2);
cv::createTrackbar("Match Method: ", "input1", &Method, Max_track, Match_Demo);
Match_Demo(0, 0);
cv::waitKey(0);
return 0;
}
void cv::minMaxLoc(cv::InputArray src, double *minVal, double *maxVal = (double *)0, cv::Point *minLoc = (cv::Point *)0, cv::Point *maxLoc = (cv::Point *)0, cv::InputArray mask = noArray())
// cv::InputArray src:输入数组
// double *minVal:最小值
// double *maxVal = (double *)0:最大值
// cv::Point *minLoc = (cv::Point *)0:最小值的位置
// cv::Point *maxLoc = (cv::Point *)0:最大值的位置
// cv::InputArray mask = noArray():输入的掩码,一般为空