欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java OpenCV-4.0.0 图像处理22 图像模板匹配

程序员文章站 2022-04-01 07:59:38
...

Java OpenCV-4.0.0 图像处理22 图像模板匹配

参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654

Java OpenCV-4.0.0 图像处理22 图像模板匹配

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

package comxu.opencv.image;

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;


/**  
 * 
 * @Title: Image.java   
 * @Package com.xu.opencv   
 * @Description: TODO   
 * @author: xuhyacinth     
 * @date: 2019年7月13日 下午12:10:14   
 * @version: V-1.0 
 * @Copyright: 2019 xuhyacinth
 *
 */
public class Image {

	static {
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
	}


	public static void main(String[] args) {
		templete(Imgproc.TM_SQDIFF_NORMED);
	}

	/**
	 * OpenCV-4.1.0 模板匹配
	 * <table border="1" cellpadding="8"> 
	 * <tr><th>输入参数</th><th>参数解释</th></tr> 
	 * <tr><td align="left">TM_SQDIFF是平方差匹配、TM_SQDIFF_NORMED是标准平方差匹配</td><td>利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大。</td></tr> 
	 * <tr><td align="left">TM_CCORR是相关性匹配、TM_CCORR_NORMED是标准相关性匹配</td><td>采用模板和图像间的乘法操作,数越大表示匹配程度较高, 0表示最坏的匹配效果。</td></tr> 
	 * <tr><td align="left">TM_CCOEFF是相关性系数匹配、TM_CCOEFF_NORMED是标准相关性系数匹配</td><td>将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。</td></tr> 
	 * <tr><td colspan="2">随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价)。</td></tr> 
	 * <tr><td colspan="2">相关性是越接近1越大越好,平方差是越小越好,所以TM_SQDIFF在使用时和其他的是有所区别的。</td></tr> 
	 * <tr><td colspan="2">模板匹配结果Mat要是32位的。</td></tr> 
	 * </table>
	 * @return: void  
	 * @date: 2019年5月7日12:16:55
	 */
	public static void templete(int method) {
		// 1 获取待匹配图片
		Mat templete=Imgcodecs.imread("C:\\Users\\hyacinth\\Pictures\\Camera Roll\\templete01.jpg");
		// 2 获取匹配模板
		Mat demo=Imgcodecs.imread("C:\\Users\\hyacinth\\Pictures\\Camera Roll\\templete02.jpg");

		int width=templete.cols()-demo.cols()+1;
		int height=templete.rows()-demo.rows()+1;
		// 3 创建32位模板匹配结果Mat
		Mat result=new Mat(width,height,CvType.CV_32FC1);
		// 4 调用 模板匹配函数
		Imgproc.matchTemplate(templete, demo, result, method);
		// 5 归一化
		Core.normalize(result, result,0, 1, Core.NORM_MINMAX, -1, new Mat());  
		// 6 获取模板匹配结果
		MinMaxLocResult mmr = Core.minMaxLoc(result);
		// 7 绘制匹配到的结果
		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.rectangle(templete,new Point(x,y),new Point(x+demo.cols(),y+demo.rows()),new Scalar( 0, 0, 255),2,Imgproc.LINE_AA);
		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);
		// 8 显示结果
		HighGui.imshow("模板匹配", templete);
		HighGui.waitKey(0);

	}

}