模板匹配
在图像处理中,经常用于从衣服位置图像中根据预先定义好的模板图像来寻找与模板图像相同或者相似的图像
模板匹配的Api函数
matchTemplate(Mat image, Mat templ, Mat result, int method)
- image:输入图像,大小为: W * H
- templ:模板图像,大小为:w * h
- result:计算结果,大小为(W-w+1)*(H-h+1)单通道浮点
- method:计算方法
其中method有以下6种方法
- TM_SQDIFF = 0: 平方不同
- TM_SQDIFF_NORMED = 1:归一化平方不同
- TM_CCORR = 2:相关性
- TM_CCORR_NORMED = 3:归一化相关性
- TM_CCOEFF = 4:相关因子
- TM_CCOEFF_NORMED = 5:归一化相关因子
使用方法
- 平方不同&归一化平方不同
结果值越小,表示子区域与模板匹配度越高 - 其他方法
结果值越高表示图像子区域与模板匹配度越高
使用模板匹配的时候首先要根据模板图像与输入图像计算得到每个像素点与模板的匹配程度值,然后根据使用的计算方法求得最大值或者最小值,得到最终匹配子图像矩形区域
相关演示
//原图片
Mat src = Imgcodecs.imread("C:\\test\\tx.jpg",Imgcodecs.IMREAD_REDUCED_COLOR_2);
//模板
Mat simple = Imgcodecs.imread("C:\\test\\tx_m.png");
//展示
HighGui.imshow("原图",src);
HighGui.imshow("模板图片",simple);
int method = Imgproc.TM_SQDIFF;//平方不同
Mat result = new Mat();//计算结果
Imgproc.matchTemplate(src,simple,result,method);//计算匹配模板
Core.MinMaxLocResult result_m = Core.minMaxLoc(result);//取最大值和最小值
Point maxloc = result_m.maxLoc;
Point minloc = result_m.minLoc;
//获取坐标
Point p1 ;
//如果是平方不同或者归一化平方不同,那么就取最小值
p1 = (method == Imgproc.TM_SQDIFF || method == Imgproc.TM_SQDIFF_NORMED) ? minloc : maxloc;
Point p2 = new Point(p1.x+simple.cols(),p1.y+simple.rows());
//绘制
Imgproc.rectangle(src,p1,p2,new Scalar(0,0,255));