记录学习一下
第一次写博
package com.dayao.sj;
import org.opencv.core.Core;
import org.opencv.core.Core.MinMaxLocResult;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class Template {
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
templete(Imgproc.TM_CCOEFF_NORMED);
}
/**
*
* TM_SQDIFF是平方差匹配、TM_SQDIFF_NORMED是标准平方差匹配,利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大。
* TM_CCORR是相关性匹配、TM_CCORR_NORMED是标准相关性匹配,采用模板和图像间的乘法操作,数越大表示匹配程度较高, 0表示最坏的匹配效果。
* TM_CCOEFF是相关性系数匹配、TM_CCOEFF_NORMED是标准相关性系数匹配,将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。
* 随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。
* 相关性是越接近1越大越好,平方差是越小越好,所以TM_SQDIFF在使用时和其他的是有所区别的。
* 模板匹配结果Mat要是32位的。
*
*/
public static void templete(int method) {
// 待匹配图片
Mat templete=Imgcodecs.imread("D:\\hello\\P71220-111952.jpg");
// 模板
Mat demo=Imgcodecs.imread("D:\\hello\\123.jpg");
int width=templete.cols()-demo.cols()+1;
int height=templete.rows()-demo.rows()+1;
// 模板匹配结果Mat要是32位的。
Mat result=new Mat(width,height,CvType.CV_32FC1);
// 模板匹配函数
Imgproc.matchTemplate(templete, demo, result, method);
// 归一化
Core.normalize(result, result,0, 1, Core.NORM_MINMAX, -1, new Mat());
//遍历result结果,找相似结果通过Limit筛选。
//因为我们用的是TM_CCOEFF_NORMED,所以结果越接近1标识匹配值越大,所以我们将匹配值大于0.9的区域框起来实现多目标匹配
double Limit =0.9;
for(int i = 0;i<result.rows();i++)
{
for(int j = 0;j<result.cols();j++)
{
double matchValue =result.get(i,j)[0];
if(matchValue>Limit)
{ //绘制匹配到的结果
Imgproc.rectangle(templete,new Point(j,i),new Point(j+demo.cols(),i+demo.rows()),new Scalar( 0, 0, 255),2,Imgproc.LINE_AA);
}
}
}
/*以下寻找最佳匹配
*MinMaxLocResult mmr = Core.minMaxLoc(result);
* double x,y; if (method==Imgproc.TM_SQDIFF_NORMED ||
* method==Imgproc.TM_SQDIFF) { x = mmr.minLoc.x; y = mmr.minLoc.y; } else { x =
* mmr.maxLoc.x; y = mmr.maxLoc.y; }
*绘制匹配到的结果
*Imgproc.putText(templete,"Match Success",new Point(x,y),Imgproc.FONT_HERSHEY_SCRIPT_COMPLEX, 1.0, new Scalar(0, 255, 0),1,Imgproc.LINE_AA);
*/
// 显示结果
HighGui.imshow("模板匹配", templete);
HighGui.waitKey(0);
}
}