《图像处理》OpenCV 匹配模板

OpenCV

参考:https://blog.csdn.net/yhmabcdef/article/details/75214020
复制:https://blog.csdn.net/shuzhe66/article/details/40817389
OpenCV下载地址 https://opencv.org/releases.html 下载win的,我下的是2.4.9,之后安装;
eclipse 搭建环境 具体参考 https://blog.csdn.net/guanjungao/article/details/30313593
加入opencv-249.jar(安装目录有),之后配置opencv\opencv-249\opencv\build\java\x64\opencv_java249.dll(具体见图片

模板匹配

将原图和要匹配原图的小图;

  • 代码TemplateMachingUtil 匹配模板工具类
import org.junit.Test;
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.highgui.Highgui;
import org.opencv.imgproc.Imgproc;

/**
 *
 * @版权: Copyright (c) 2016-2017 *********公司技术开发部
 * @author : huangjiapeng
 * @E-mail:1625545295@qq.com
 * @版本: 1.0
 * @创建日期: 2018年7月21日 下午1:54:17
 * @ClassName TemplateMachingUtil
 * @类描述-Description:  TODO 
 * @修改记录:
 * @版本: 1.0
 */
/**
 * @author Administrator
 *
 */
public class TemplateMachingUtil {
    /**
     * 
     * @param
     * @Description: TODO 测试
     * @return void
     */
    @Test
    public void TestFixedPosition() {
        MyPoint p = TemplateMachingUtil.fixedPosition("G:\\a\\r22.png", "G:\\a\\r2.png");
        // p点 也是一个表示图片位置的,至于如何转你需要的位置形式,你自己去百度
    }

    /**
     * 
     * @param sourceImage
     *            原图
     * @param dstImage
     *            从原图中要找的图
     * @Description: TODO
     * @return MyPoint matchLoc.x, matchLoc.y也是一个表示位置的,至于如何转你需要的,你自己去百度
     */
    public static MyPoint fixedPosition(String sourceImage, String dstImage) {
        System.loadLibrary("opencv_java249");
        TemplateMaching macher = new TemplateMaching();
        macher.setSource(sourceImage);
        macher.setDst(dstImage);
        /**************************************/
        String sourcePath = sourceImage, dstPath = dstImage;
        Mat source, dst;
        // 将文件读入为OpenCV的Mat格式
        source = Highgui.imread(sourcePath);
        dst = Highgui.imread(dstPath);
        // 创建于原图相同的大小,储存匹配度
        System.out.println("行" + source.rows() + " " + "列" + source.cols());
        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));
        // 将结果输出到对应位置 路径 G:\\a\\TMOutPut2.png
        // Highgui.imwrite("G:\\a\\TMOutPut2.png", source);
        /*****************************************/
        MyPoint p = new MyPoint(matchLoc.x, matchLoc.y);
        return p;
    }
}
  • MyPoint类
/**
 *
 * @版权: Copyright (c) 2016-2017 *********公司技术开发部
 * @author : huangjiapeng
 * @E-mail:1625545295@qq.com
 * @版本: 1.0
 * @创建日期: 2018年7月21日 下午1:47:31
 * @ClassName MyPoint
 * @类描述-Description:  TODO 
 * @修改记录:
 * @版本: 1.0
 */
public class MyPoint {
    private double x;
    private double y;

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    /**
     * @param x
     * @param y
     */
    public MyPoint(double x, double y) {
        super();
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString() {
        return "MyPoint [x=" + x + ", y=" + y + "]";
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值