1. 程式人生 > >OpenCV學習筆記[4]模板匹配

OpenCV學習筆記[4]模板匹配

OpenCV學習筆記:模板匹配 Java version

        首先我要糾正一個錯誤的學習習慣,像OpenCV這樣的大型庫,按照官方教程一步一步除錯的學習效率太低了,OpenCV就像字典一樣,當我們需要計算機進行某些視覺特性模擬時,針對具體問題去檢索庫中對應的API即可。

        儘管官方教程非常詳細,但除了人臉識別的Demo和一套doc外,沒有其他Java例項,教程中詳細的例項都由C語言編寫,我在測試的過程中會將對應部分按照OOP形式重寫為Java模組,並在學習筆記中貼出。

        官方教程可以在OpenCV庫解壓目錄的build/doc下找到,當然,是英文的。

[簡介]

       模板匹配,通俗的講,提供原始圖片與其中的一部分,找出該部分在原始圖片中的位置,它存在諸多限制,對模板的轉置與縮放會嚴重影響匹配結果,但容許一定的失真。

[模板匹配]

TemplateMaching.java:

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.imgproc.Imgproc;

public class TemplateMaching {
	private String sourcePath,dstPath;
	private Mat source,dst;
	//原圖片
	public void setSource(String picPath){
		this.sourcePath = picPath;
	}
	//需要匹配的部分
	public void setDst(String picPath){
		this.dstPath = picPath;
	}
	//處理,生成結果圖
	public void process(){
		//將檔案讀入為OpenCV的Mat格式
		source = Highgui.imread(sourcePath);
		dst = Highgui.imread(dstPath);
		//創建於原圖相同的大小,儲存匹配度
		Mat result = Mat.zeros(source.rows(),source.cols(),CvType.CV_32FC1);
		//呼叫模板匹配方法
		Imgproc.matchTemplate(source, dst, result,Imgproc.TM_SQDIFF);
		//規格化
		Core.normalize(result, result, 0, 1,Core.NORM_MINMAX, -1);
		//獲得最可能點,MinMaxLocResult是其資料格式,包括了最大、最小點的位置x、y
		MinMaxLocResult mlr = Core.minMaxLoc(result);
		Point matchLoc = mlr.minLoc;
		//在原圖上的對應模板可能位置畫一個綠色矩形
		Core.rectangle(source, matchLoc, new Point(matchLoc.x + dst.width(),matchLoc.y + dst.height()),new Scalar(0,255,0));
		//將結果輸出到對應位置
		Highgui.imwrite("./Result/TMOutPut.png",source);
	}
	public static void main(String[] args) {
		System.loadLibrary("opencv_java249");
		
		TemplateMaching macher = new TemplateMaching();
		//設定原圖
		macher.setSource("./Data/Lession4/BK.jpg");
		//設定要匹配的圖
		macher.setDst("./Data/Lession4/BK_DST_DES.jpg");
		
		macher.process();
	}
}

[測試圖例]

原圖:


匹配圖(原始、轉置、縮放、失真):

   

[測試結果]

[原始測試]


↑匹配

[轉置測試]


↑產生偏移

[縮放測試]


↑產生偏移,大小錯誤

[失真測試]


↑匹配

[總結]

      對於影象識別,模板對映存在著較大的限制,在今後的學習中會著重尋找特性匹配的內容。