国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了【教程】Autojs使用OpenCV進行SIFT/BRISK等算法進行圖像匹配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

轉(zhuǎn)載請注明出處:小鋒學長生活大爆炸[xfxuezhang.cn]

????????此代碼可以替代內(nèi)置的images.findImage函數(shù)使用,但可能會誤匹配,如果是對匹配結(jié)果要求比較高的,還是得謹慎使用。文章來源地址http://www.zghlxwxcb.cn/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);

  // 轉(zhuǎn)灰度圖
  // console.log("轉(zhuǎn)灰度圖");
  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);

  //對匹配結(jié)果進行篩選,依據(jù)distance進行篩選
  // console.log("對匹配結(jié)果進行篩選");
  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 個,則認為模板圖在原圖中,該值可以自行調(diào)整
  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 尋找匹配上的關(guān)鍵點的變換
    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;
  }
}

到了這里,關(guān)于【教程】Autojs使用OpenCV進行SIFT/BRISK等算法進行圖像匹配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Opencv C++ SIFT特征提?。▎螆D像,多圖像)+如何設(shè)置閾值+如何對文件夾進行批處理+如何設(shè)置掩膜裁剪影像

    Opencv C++ SIFT特征提?。▎螆D像,多圖像)+如何設(shè)置閾值+如何對文件夾進行批處理+如何設(shè)置掩膜裁剪影像

    SIFT(Scale-Invariant Feature Transform)是一種用于圖像處理和計算機視覺的特征提取算法。由David Lowe于1999年首次提出,它是一種非常有效的局部特征描述符,具有尺度不變性、旋轉(zhuǎn)不變性和對部分遮擋的魯棒性。 SIFT特征提取的主要步驟包括: 尺度空間極值檢測(Scale-Space Extrem

    2024年01月19日
    瀏覽(29)
  • 【opencv】示例-grabcut.cpp  使用OpenCV庫的GrabCut算法進行圖像分割

    【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++程序。它允許用戶通過交互式方式選擇圖像中的一個區(qū)域,并利用GrabCut算法嘗試將其分割出來。代碼中包含用戶操作指南、

    2024年04月13日
    瀏覽(24)
  • OpenCV使用SURF和SIFT算法報錯解決記錄

    OpenCV使用SURF和SIFT算法報錯解決記錄

    OpenCV使用SURF和SIFT算法報錯解決記錄 1.報錯代碼,使用以下兩種寫法都會報錯 第一種報錯 AttributeError: module ‘cv2’ has no attribute ‘xfeatures2d’ 第二種報錯 AttributeError: module ‘cv2’ has no attribute ‘SURF_create’ 2.查找網(wǎng)絡(luò)上的解決辦法,大部分分為兩種 SIFT和SURF算法申請了專利,

    2024年02月07日
    瀏覽(28)
  • python+openCV使用SIFT算法實現(xiàn)印章的總相似度檢測

    python+openCV使用SIFT算法實現(xiàn)印章的總相似度檢測

    首先整體流程是預(yù)建了一個印章庫,包含若干張圖片。目的是輸入一張印章圖片,與庫里圖片對比,最終顯示相似度最高的三張。記一下關(guān)鍵代碼。 1.圖像預(yù)處理 主要是紅色區(qū)域提取、常規(guī)灰度二值、對于形態(tài)不好的圖片做個腐蝕啥的。 2.做一個霍夫圓打開,方便后續(xù)文字識

    2024年02月08日
    瀏覽(19)
  • OpenCV Python – 使用SIFT算法實現(xiàn)兩張圖片的特征匹配

    1.要實現(xiàn)在大圖中找到任意旋轉(zhuǎn)、縮放等情況下的小圖位置,可以使用特征匹配算法,如 SIFT (尺度不變特征變換) 或 SURF (加速穩(wěn)健特征)。這些算法可以在不同尺度和旋轉(zhuǎn)情況下尋找匹配的特征點 2.我們使用了 SIFT 算法檢測和匹配特征點,然后使用 RANSAC 算法計算透視變換矩陣

    2024年02月06日
    瀏覽(23)
  • 基于SIFT算法的圖像匹配

    基于SIFT算法的圖像匹配

    基本概念 尺度不變特征轉(zhuǎn)換(Scale-invariant feature transform,簡稱SIFT) ,是一種用來偵測與描述影像中的局部性特征的算法,它在空間尺度中尋找極值點,提取位置、尺度、旋轉(zhuǎn)不變量,生成特征描述子。 SIFT算法的實質(zhì)是在不同的尺度空間上查找關(guān)鍵點(特征點),并計算出關(guān)鍵點

    2024年01月19日
    瀏覽(26)
  • 基于SIFT的圖像Matlab拼接教程

    基于SIFT的圖像Matlab拼接教程

    圖像拼接技術(shù),將普通圖像或視頻圖像進行無縫拼接,得到超寬視角甚至360度的全景圖,這樣就可以用普通數(shù)碼相機實現(xiàn)場面宏大的景物拍攝。利用計算機進行匹配,將多幅具有重疊關(guān)系的圖像拼合成為一幅具有更大視野范圍的圖像,這就是圖像拼接的目的。 圖1 基于SIFT圖像

    2024年02月02日
    瀏覽(15)
  • OpenCV-Python(32):SIFT算法

    OpenCV-Python(32):SIFT算法

    學習SIFT 算法的概念 學習在圖像中查找SIFT關(guān)鍵點和描述符 ????????在前面兩節(jié)我們學習了一些角點檢測技術(shù):比如Harris 等。它們具有 旋轉(zhuǎn)不變特性, 即使圖片發(fā)生了旋轉(zhuǎn),我們也能找到同樣的角點。很明顯即使圖像發(fā)生旋轉(zhuǎn)之后角點還是角點。但是,如果我們對圖像進

    2024年02月02日
    瀏覽(28)
  • 無人機航拍圖像匹配——SIFT算法實踐(含代碼)

    無人機航拍圖像匹配——SIFT算法實踐(含代碼)

    SIFT(Scale-Invariant Feature Transform)算法是由David Lowe于1999年提出的一種用于圖像處理和計算機視覺中的特征提取和匹配方法。它在航拍圖像匹配中具有重要的意義,主要體現(xiàn)在以下幾個方面: 尺度不變性 :航拍圖像通常具有大范圍的尺度變化,例如拍攝距離目標較遠或較近的

    2024年02月04日
    瀏覽(22)
  • OpenCV 入門教程:SIFT和SURF特征描述

    SIFT (尺度不變特征變換)和 SURF (加速穩(wěn)健特征)是圖像處理中常用的特征描述算法,用于提取圖像中的關(guān)鍵點和生成對應(yīng)的特征描述子。這些算法具有尺度不變性、旋轉(zhuǎn)不變性和光照不變性等特點,適用于圖像匹配、目標識別和三維重建等應(yīng)用。本文將以 SIFT 和 SURF 特征

    2024年02月15日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包