Opencv学习---模板匹配

功能简述:

        实现图像中某目标物体的匹配,并用矩形框绘制出来。

代码如下:

#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;

}

效果如下:

结果显示匹配效果并不是很好,猜测是模板图截得过窄,而模板匹配的过程中需要根据每个关键点的领域信息来进行计算,所以边界处特征点匹配出现误差, 所以为了验证,重新截取边界留得稍宽些的模板图,再次测试效果如下:

效果图证明,原因确实同上述猜想。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值