Java OpenCV-4.0.0 圖像處理22 圖像模板匹配

Java OpenCV-4.0.0 圖像處理22 圖像模板匹配

Java OpenCV-4.0.0 圖像處理 圖像模板匹配

模板匹配就是在整個圖像區域發現與給定子圖像匹配的小塊區域。

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

	}

}

模板匹配

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章