【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配

这篇具有很好参考价值的文章主要介绍了【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

        此代码可以替代内置的images.findImage函数使用,但可能会误匹配,如果是对匹配结果要求比较高的,还是得谨慎使用。文章来源地址https://www.toymoban.com/news/detail-728173.html


runtime.images.initOpenCvIfNeeded();
importClass(java.util.ArrayList);
importClass(java.util.List);
importClass(java.util.LinkedList);
importClass(org.opencv.imgproc.Imgproc);
importClass(org.opencv.imgcodecs.Imgcodecs);
importClass(org.opencv.core.Core);
importClass(org.opencv.core.Mat);
importClass(org.opencv.core.MatOfDMatch);
importClass(org.opencv.core.MatOfKeyPoint);
importClass(org.opencv.core.MatOfRect);
importClass(org.opencv.core.Size);
importClass(org.opencv.features2d.DescriptorMatcher);
importClass(org.opencv.features2d.Features2d);
importClass(org.opencv.features2d.SIFT);
importClass(org.opencv.features2d.ORB);
importClass(org.opencv.features2d.BRISK);
importClass(org.opencv.features2d.AKAZE);
importClass(org.opencv.features2d.BFMatcher);
importClass(org.opencv.core.MatOfPoint2f);
importClass(org.opencv.calib3d.Calib3d);
importClass(org.opencv.core.CvType);
importClass(org.opencv.core.Point);
importClass(org.opencv.core.Scalar);
importClass(org.opencv.core.MatOfByte);

/*
 * 用法示例:
 * var image1 = captureScreen();
 * var image2 = images.read('xxxx');
 * match(image1, image2);
 */

function match(img1, img2, method) {
  console.time("匹配耗时");
  // 指定特征点算法SIFT
  var match_alg = null;
  if(method == 'sift') {
    match_alg = SIFT.create();
  }else if(method == 'orb') {
    match_alg = ORB.create();
  }else if(method == 'brisk') {
    match_alg = BRISK.create();
  }else {
    match_alg = AKAZE.create();
  }
  

  var bigTrainImage = Imgcodecs.imdecode(new MatOfByte(images.toBytes(img1)), Imgcodecs.IMREAD_UNCHANGED);
  var smallTrainImage = Imgcodecs.imdecode(new MatOfByte(images.toBytes(img2)), Imgcodecs.IMREAD_UNCHANGED);

  // 转灰度图
  // console.log("转灰度图");
  var big_trainImage_gray = new Mat(bigTrainImage.rows(), bigTrainImage.cols(), CvType.CV_8UC1);
  var small_trainImage_gray = new Mat(smallTrainImage.rows(), smallTrainImage.cols(), CvType.CV_8UC1);
  Imgproc.cvtColor(bigTrainImage, big_trainImage_gray, Imgproc.COLOR_BGR2GRAY);
  Imgproc.cvtColor(smallTrainImage, small_trainImage_gray, Imgproc.COLOR_BGR2GRAY);

  // 获取图片的特征点
  // console.log("detect");
  var big_keyPoints = new MatOfKeyPoint();
  var small_keyPoints = new MatOfKeyPoint();
  match_alg.detect(bigTrainImage, big_keyPoints);
  match_alg.detect(smallTrainImage, small_keyPoints);

  // 提取图片的特征点
  // console.log("compute");
  var big_trainDescription = new Mat(big_keyPoints.rows(), 128, CvType.CV_32FC1);
  var small_trainDescription = new Mat(small_keyPoints.rows(), 128, CvType.CV_32FC1);
  match_alg.compute(big_trainImage_gray, big_keyPoints, big_trainDescription);
  match_alg.compute(small_trainImage_gray, small_keyPoints, small_trainDescription);

  // console.log("matcher.train");
  var matcher = new BFMatcher();
  matcher.clear();
  var train_desc_collection = new ArrayList();
  train_desc_collection.add(big_trainDescription);
  // vector<Mat>train_desc_collection(1, trainDescription);
  matcher.add(train_desc_collection);
  matcher.train();

  // console.log("knnMatch");
  var matches = new ArrayList();
  matcher.knnMatch(small_trainDescription, matches, 2);

  //对匹配结果进行筛选,依据distance进行筛选
  // console.log("对匹配结果进行筛选");
  var goodMatches = new ArrayList();
  var nndrRatio = 0.8;

  var len = matches.size();
  for (var i = 0; i < len; i++) {
    var matchObj = matches.get(i);
    var dmatcharray = matchObj.toArray();
    var m1 = dmatcharray[0];
    var m2 = dmatcharray[1];
    if (m1.distance <= m2.distance * nndrRatio) {
      goodMatches.add(m1);
    }
  }

  var matchesPointCount = goodMatches.size();
  //当匹配后的特征点大于等于 4 个,则认为模板图在原图中,该值可以自行调整
  if (matchesPointCount >= 4) {
    log("模板图在原图匹配成功!");
    var templateKeyPoints = small_keyPoints;
    var originalKeyPoints = big_keyPoints;

    var templateKeyPointList = templateKeyPoints.toList();
    var originalKeyPointList = originalKeyPoints.toList();
    var objectPoints = new LinkedList();
    var scenePoints = new LinkedList();
    var goodMatchesList = goodMatches;

    var len = goodMatches.size();
    for (var i = 0; i < len; i++) {
      var goodMatch = goodMatches.get(i);
      objectPoints.addLast(templateKeyPointList.get(goodMatch.queryIdx).pt);
      scenePoints.addLast(originalKeyPointList.get(goodMatch.trainIdx).pt);
    }

    var objMatOfPoint2f = new MatOfPoint2f();
    objMatOfPoint2f.fromList(objectPoints);
    var scnMatOfPoint2f = new MatOfPoint2f();
    scnMatOfPoint2f.fromList(scenePoints);
    //使用 findHomography 寻找匹配上的关键点的变换
    var homography = Calib3d.findHomography(objMatOfPoint2f, scnMatOfPoint2f, Calib3d.RANSAC, 3);

    /**
     * 透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。
     */
    var templateCorners = new Mat(4, 1, CvType.CV_32FC2);
    var templateTransformResult = new Mat(4, 1, CvType.CV_32FC2);
    var templateImage = smallTrainImage;
    var doubleArr = util.java.array("double", 2);
    doubleArr[0] = 0;
    doubleArr[1] = 0;
    templateCorners.put(0, 0, doubleArr);
    doubleArr[0] = templateImage.cols();
    doubleArr[1] = 0;
    templateCorners.put(1, 0, doubleArr);
    doubleArr[0] = templateImage.cols();
    doubleArr[1] = templateImage.rows();
    templateCorners.put(2, 0, doubleArr);
    doubleArr[0] = 0;
    doubleArr[1] = templateImage.rows();
    templateCorners.put(3, 0, doubleArr);
    //使用 perspectiveTransform 将模板图进行透视变以矫正图象得到标准图片
    Core.perspectiveTransform(templateCorners, templateTransformResult, homography);

    //矩形四个顶点
    var pointA = templateTransformResult.get(0, 0);
    var pointB = templateTransformResult.get(1, 0);
    var pointC = templateTransformResult.get(2, 0);
    var pointD = templateTransformResult.get(3, 0);

    var y0 = Math.round(pointA[1])>0?Math.round(pointA[1]):0;
    var y1 = Math.round(pointC[1])>0?Math.round(pointC[1]):0;
    var x0 = Math.round(pointD[0])>0?Math.round(pointD[0]):0;
    var x1 = Math.round(pointB[0])>0?Math.round(pointB[0]):0;
    console.timeEnd("匹配耗时");
    return {x: x0, y: y0};
  } else {
    console.timeEnd("匹配耗时");
    log("模板图不在原图中!");
    return null;
  }
}

到了这里,关于【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Opencv C++ SIFT特征提取(单图像,多图像)+如何设置阈值+如何对文件夹进行批处理+如何设置掩膜裁剪影像

    SIFT(Scale-Invariant Feature Transform)是一种用于图像处理和计算机视觉的特征提取算法。由David Lowe于1999年首次提出,它是一种非常有效的局部特征描述符,具有尺度不变性、旋转不变性和对部分遮挡的鲁棒性。 SIFT特征提取的主要步骤包括: 尺度空间极值检测(Scale-Space Extrem

    2024年01月19日
    浏览(33)
  • 【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割

    left mouse button - set rectangle SHIFT+left mouse button - set GC_FGD pixels CTRL+left mouse button - set GC_BGD pixels 这段代码是一个 使用OpenCV库的GrabCut算法进行图像分割 的C++程序。它允许用户通过交互式方式选择图像中的一个区域,并利用GrabCut算法尝试将其分割出来。代码中包含用户操作指南、

    2024年04月13日
    浏览(35)
  • OpenCV使用SURF和SIFT算法报错解决记录

    OpenCV使用SURF和SIFT算法报错解决记录 1.报错代码,使用以下两种写法都会报错 第一种报错 AttributeError: module ‘cv2’ has no attribute ‘xfeatures2d’ 第二种报错 AttributeError: module ‘cv2’ has no attribute ‘SURF_create’ 2.查找网络上的解决办法,大部分分为两种 SIFT和SURF算法申请了专利,

    2024年02月07日
    浏览(28)
  • python+openCV使用SIFT算法实现印章的总相似度检测

    首先整体流程是预建了一个印章库,包含若干张图片。目的是输入一张印章图片,与库里图片对比,最终显示相似度最高的三张。记一下关键代码。 1.图像预处理 主要是红色区域提取、常规灰度二值、对于形态不好的图片做个腐蚀啥的。 2.做一个霍夫圆打开,方便后续文字识

    2024年02月08日
    浏览(36)
  • OpenCV Python – 使用SIFT算法实现两张图片的特征匹配

    1.要实现在大图中找到任意旋转、缩放等情况下的小图位置,可以使用特征匹配算法,如 SIFT (尺度不变特征变换) 或 SURF (加速稳健特征)。这些算法可以在不同尺度和旋转情况下寻找匹配的特征点 2.我们使用了 SIFT 算法检测和匹配特征点,然后使用 RANSAC 算法计算透视变换矩阵

    2024年02月06日
    浏览(36)
  • 基于SIFT算法的图像匹配

    基本概念 尺度不变特征转换(Scale-invariant feature transform,简称SIFT) ,是一种用来侦测与描述影像中的局部性特征的算法,它在空间尺度中寻找极值点,提取位置、尺度、旋转不变量,生成特征描述子。 SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点

    2024年01月19日
    浏览(75)
  • 基于SIFT的图像Matlab拼接教程

    图像拼接技术,将普通图像或视频图像进行无缝拼接,得到超宽视角甚至360度的全景图,这样就可以用普通数码相机实现场面宏大的景物拍摄。利用计算机进行匹配,将多幅具有重叠关系的图像拼合成为一幅具有更大视野范围的图像,这就是图像拼接的目的。 图1 基于SIFT图像

    2024年02月02日
    浏览(26)
  • OpenCV-Python(32):SIFT算法

    学习SIFT 算法的概念 学习在图像中查找SIFT关键点和描述符         在前面两节我们学习了一些角点检测技术:比如Harris 等。它们具有 旋转不变特性, 即使图片发生了旋转,我们也能找到同样的角点。很明显即使图像发生旋转之后角点还是角点。但是,如果我们对图像进

    2024年02月02日
    浏览(33)
  • 无人机航拍图像匹配——SIFT算法实践(含代码)

    SIFT(Scale-Invariant Feature Transform)算法是由David Lowe于1999年提出的一种用于图像处理和计算机视觉中的特征提取和匹配方法。它在航拍图像匹配中具有重要的意义,主要体现在以下几个方面: 尺度不变性 :航拍图像通常具有大范围的尺度变化,例如拍摄距离目标较远或较近的

    2024年02月04日
    浏览(33)
  • OpenCV 入门教程:SIFT和SURF特征描述

    SIFT (尺度不变特征变换)和 SURF (加速稳健特征)是图像处理中常用的特征描述算法,用于提取图像中的关键点和生成对应的特征描述子。这些算法具有尺度不变性、旋转不变性和光照不变性等特点,适用于图像匹配、目标识别和三维重建等应用。本文将以 SIFT 和 SURF 特征

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包