基于模板匹配的程序(可以作为面部识别的哦)

模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配部分的技术,模板匹配技术是由MatchTemplate()函数完成,但是此项技术不是基于直方图的,是通过在输入图像上滑动图像块,对实际的图像块和输入图像进行匹配的一种匹配方法:
滑动模板图像来寻找图像中和模板图像最匹配的部分实现模板匹配:
matchTemplate()函数用于匹配出和模板重叠的图像区域
C++:void matchTemplate(InputArray image,InputArray template,OutputArray result,int method);
1.表示待搜索的图像,且需要为8位或者32位浮点型图像
2.表示搜索模板,需要和原图像有相同的数据类型,且尺寸不能大于源图像
3.OutputArray类型的result,比较结果的映射图像,其必须为单通道,32位浮点型图像,如果图像尺寸是WH的template的尺寸是wh的则result的类型为:(W-w+1,H-h+1)
4.int类型的method,指定的匹配方法,Opencv提供了6种图像匹配的方法可供使用。
1.平方差匹配法 method=TM_SQDIFF
2.归一化平方差匹配法 method=TM_SQDIFF_NORMED
3.相关匹配法 method=TM_CCORR;
4.归一化相关匹配法 method=TM_CCORR_NORMED
5.系数匹配法: method=TM_CCOEFF
6.化相关系数匹配法 method=TM_CCOEFF_NORMED
通常,随着简单的测量(平方差)到更为复杂的测量(相关系数),我们获得了越来越准确的匹配,越精确的匹配意味着计算量大为代价,比较科学的办法就是对所有的这些方法多次测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案。
以下是一个单一基于模板匹配的人脸识别:使用方法就是给自己拍一张照片放到自己的工程中,然后在程序中定义就可以了,编译就可以直接用,检测出你的脸:

#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>

using namespace cv;
using namespace std;

Mat srcImg,templateImg,resultImg;

int MatchMethod=TM_CCOEFF_NORMED;

int main()
{
VideoCapture capture(0);

while(1){

 Mat frame;
capture>>frame;

templateImg=imread("2-3.jpg");
namedWindow("原图");
//namedWindow("效果图");
Mat srcImg1;
frame.copyTo(srcImg1);

int resultImage_rows=srcImg1.rows-templateImg.rows+1;
int resultImage_cols=srcImg1.cols-templateImg.cols+1;
resultImg.create(resultImage_rows,resultImage_cols,CV_32FC1);
matchTemplate(srcImg1,templateImg,resultImg,MatchMethod);
normalize(resultImg,resultImg,0,1,NORM_MINMAX,-1,Mat());

double minValue,maxValue;
Point minLocation,maxLocation,matchLocation;
minMaxLoc(resultImg,&minValue,&maxValue,&minLocation,&maxLocation,Mat());
if(MatchMethod==TM_CCOEFF_NORMED)
{
      matchLocation=maxLocation;
}
rectangle(srcImg1,matchLocation,Point(matchLocation.x+templateImg.cols,matchLocation.y+templateImg.rows),Scalar(0,255,0),2,8,0);
//rectangle(resultImg,matchLocation,Point(matchLocation.x+templateImg.cols,matchLocation.y+templateImg.rows),Scalar(0,255,0),2,8,0);
imshow("原图",srcImg1);
//imshow("效果图",resultImg);


waitKey(20);
}
return 0;

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值