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