功能简述:
实现图像中某目标物体的匹配,并用矩形框绘制出来。
代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv) {
cv::Mat src,template_img,dst;
template_img = cv::imread("D:/VS2015_Projects/opencv_workspace/img/测距用图/template_img.jpg");
src = cv::imread("D:/VS2015_Projects/opencv_workspace/img/测距用图/m1.jpg");
if (src.empty() || template_img.empty())
{
std::cout << "image load failed!" << std::endl;
return -1;
}
cv::resize(template_img, template_img, cv::Size(template_img.cols / 2, template_img.rows / 2));
cv::resize(src, src, cv::Size(src.cols / 2, src.rows / 2));
imshow("template image", template_img);
imshow("src image", src);
//定义搜索区域
//此处定位左1/3图
cv::Mat roi(src, cv::Rect(0, 0, src.cols / 3, src.rows));
//进行模板匹配
cv::matchTemplate(src,template_img, dst, CV_TM_SQDIFF/*相似度*/);
double minVal, maxVal;
cv::Point minPt, maxPt;
cv::minMaxLoc(dst, &minVal, &maxVal, &minPt, &maxPt);
// 在相似度最高的位置绘制矩形
// 本例中为minPt
cv::rectangle(src,
cv::Rect(minPt.x, minPt.y, template_img.cols, template_img.rows),
255);
imshow("匹配结果", src);
cv::waitKey(0);
return 0;
}
效果如下:
结果显示匹配效果并不是很好,猜测是模板图截得过窄,而模板匹配的过程中需要根据每个关键点的领域信息来进行计算,所以边界处特征点匹配出现误差, 所以为了验证,重新截取边界留得稍宽些的模板图,再次测试效果如下:
效果图证明,原因确实同上述猜想。