AWIROK软件opencv原生模板找图转座标方法

104

主题

190

回帖

993

积分

管理员

积分
993
AWIROK软件opencv原生模板找图转座标方法



  1. importClass(org.opencv.imgproc.Imgproc)
  2. importClass(org.opencv.imgcodecs.Imgcodecs);
  3. importPackage(org.opencv.core);

  4. function base64ToMat(base64) {
  5.     // 解码Base64字符串为字节数组
  6.     var decodedBytes = android.util.Base64.decode(base64, android.util.Base64.DEFAULT);
  7.     // 使用Imgcodecs将字节数组转换为Mat对象
  8.     var mat = Imgcodecs.imdecode(new MatOfByte(decodedBytes), Imgcodecs.IMREAD_COLOR);
  9.     return mat;
  10. }


  11. var small = "这里是你的小图像Base64编码字符串";
  12. var big = "这里是你的大图像Base64编码字符串";
  13. var sourceMat = base64ToMat(small)
  14. var templateMat = base64ToMat(big)

  15. // var sourceMat = screen.screenShot(432, 768, 100).getMat()
  16. // var sourceMat = Imgcodecs.imread('/sdcard/Pictures/2.jpg');
  17. // var templateMat = Imgcodecs.imread('/sdcard/Pictures/1.jpg');

  18. var t = new Date().getTime()
  19. for (var i = 0; i < 200; i++) {
  20.     var result = new org.opencv.core.Mat();
  21.     Imgproc.matchTemplate(sourceMat, templateMat, result, Imgproc.TM_CCOEFF_NORMED);
  22.     var mmr = Core.minMaxLoc(result);
  23.     if (mmr.maxVal > 0.9) {
  24.         var rect = new Rect(mmr.maxLoc, new Size(templateMat.cols(), templateMat.rows()));
  25.         printl("匹配结果",i, "找到模板在位置: " + rect);
  26.     }
  27.     result.release();
  28. }
  29. printl(i, '耗时', (new Date().getTime() - t))
  30. sourceMat.release();
  31. templateMat.release();

复制代码
这段代码是使用OpenCV库进行图像匹配的JavaScript代码示例。它的主要功能是在一个较大的图像中查找一个小图像的位置。以下是代码的详细说明:
  • 导入OpenCV库:

    • importClass(org.opencv.imgproc.Imgproc):导入图像处理类Imgproc,该类包含了图像模板匹配的方法。
    • importClass(org.opencv.imgcodecs.Imgcodecs):导入图像编码解码类Imgcodecs,该类用于读取和写入图像文件,以及将字节数组转换为Mat对象。
    • importPackage(org.opencv.core):导入OpenCV的核心包,包含了图像表示类Mat,以及其他诸如矩形Rect、尺寸Size等类。
  • 定义Base64转Mat函数:

    • base64ToMat(base64):这个函数接收一个Base64编码的字符串作为参数,将其解码为字节数组,然后使用Imgcodecs.imdecode方法将字节数组转换为Mat对象,并返回这个Mat对象。
    • android.util.Base64.decode(base64, android.util.Base64.DEFAULT):解码Base64编码的图像字符串。
    • Imgcodecs.imdecode(new MatOfByte(decodedBytes), Imgcodecs.IMREAD_COLOR):将解码得到的字节数组转换为Mat对象,其中IMREAD_COLOR表示以彩色模式读取图像。
  • 准备图像数据:

    • small 和 big:这两个变量分别存储了小图像和大图像的Base64编码字符串。你需要将实际的Base64编码字符串替换此处的占位符文本。
    • sourceMat 和 templateMat:通过base64ToMat函数将小图像和大图像的Base64编码字符串转换为Mat对象,分别存储在这两个变量中。
  • 图像匹配:

    • for (var i = 0; i < 200; i++) {...}:循环200次进行图像匹配操作。
    • Imgproc.matchTemplate(sourceMat, templateMat, result, Imgproc.TM_CCOEFF_NORMED):在大图像(sourceMat)中查找小图像(templateMat),并将匹配结果存储在result Mat对象中。TM_CCOEFF_NORMED是一种匹配方法。
    • Core.minMaxLoc(result):计算匹配结果矩阵中最小值和最大值的位置和值。
    • if (mmr.maxVal > 0.9) {...}:如果匹配的最大值大于0.9(即匹配度超过90%),则认为找到了匹配的小图像。
    • var rect = new Rect(mmr.maxLoc, new Size(templateMat.cols(), templateMat.rows())):根据匹配结果的最大值位置创建一个矩形对象,该矩形的大小与小图像相同。
    • printl("匹配结果",i, "找到模板在位置: " + rect):打印匹配结果,包括匹配次数和找到的小图像的位置。
  • 释放资源:

    • result.release():每次循环后释放结果Mat对象占用的内存。
    • printl(i, '耗时', (new Date().getTime() - t)):循环结束后打印总的匹配次数和整个过程耗时。
    • sourceMat.release();templateMat.release();:最后释放大图像和小图像的Mat对象占用的内存。
这段代码适用于在安卓平台上使用JavaScript调用OpenCV库进行图像匹配,例如在自动化测试脚本中查找某个按钮或图标在屏幕上的位置。注意,实际运行时需要确保OpenCV已正确集成到你的项目中。
1.png 2.png


举报 回复