首页 > 代码库 > OpenCV学习笔记[4]模板匹配 Java version

OpenCV学习笔记[4]模板匹配 Java version

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

[测试图例]

原图:


匹配图(原始、转置、缩放、失真):

   

[测试结果]

[原始测试]


↑匹配

[转置测试]


↑产生偏移

[缩放测试]


↑产生偏移,大小错误

[失真测试]


↑匹配

[总结]

      对于图像识别,模板映射存在着较大的限制,在今后的学习中会着重寻找特性匹配的内容。

OpenCV学习笔记[4]模板匹配 Java version