牙叔教程 简单易懂

效果展示

查找右上角的叉叉按钮

缘起

很多人都在想怎么查找右上角这个叉叉, 然后有人问我, 我就研究一下

环境

手机: Mi 11 Pro

Android版本: 11

Autojs版本: 9.0.10

思路

  • 先裁剪一张右上角的叉叉按钮截图
  • 提取大图小图的轮廓
  • 对比轮廓特征
  • 显示匹配最佳的轮廓

轮廓特征有哪些

  • 矩形度, 矩形度体现物体对其外接矩形的充满程度, 也就是轮廓面积和外接矩形的面积比例
  • 宽高比, 轮廓最小外接矩形的宽和高的比值
  • matchShapes比较两个轮廓的相似度

本文使用了以上3种, 来对比两个轮廓是否相似,

轮廓特征还有别的, 请百度OpenCV轮廓特征, 或者, Halcon区域特征

你将学到以下知识点

  • 轮廓外接矩形
  • 轮廓最小外接矩形
  • 提取图片轮廓
  • 绘制图片轮廓
  • 绘制文字到指定位置
  • 计算轮廓质心
  • 矩形度
  • 计算轮廓面积
  • 高斯, 二值化
  • opencv资源释放

轮廓分析

小图

大图

上面这个图片是依据matchShapes比较两个轮廓的相似度,
相似度的阈值设置为了9, 小于9的都会画出来,
图片中的数字就是该轮廓和叉叉按钮的相似度,

右上角的叉叉按钮截图是在1080X1920的分辨率上截图的,
大图是1152X2376,

大图中的叉叉按钮相似度是7.168, 不是最小的(数值越小越相似)
反而那个字是最低的,6.700,

所以我要加上其他特征,
矩形度宽高比,
加上以后, 其他轮廓都不符合特征,

就只剩下右上角的叉叉按钮了

轮廓查找适用场景

透明的按钮, 并且图形简单

提高轮廓查找准确性和速度

指定找图区域, 裁剪多余图片区域, 再用轮廓找图

代码讲解

1. 导入类
runtime.images.initOpenCvIfNeeded();
importClass(org.opencv.core.MatOfByte);
importClass(org.opencv.core.Scalar);
importClass(org.opencv.core.Point);
importClass(org.opencv.core.CvType);
importClass(java.util.List);
importClass(java.util.ArrayList);
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.core.MatOfPoint2f);
2. 读取图片
var bigImgPath = "/storage/emulated/0/脚本/autojs查找轮廓相似的图片/大图_关闭广告.jpg";
var smallImgPath = "/storage/emulated/0/脚本/autojs查找轮廓相似的图片/小图_关闭广告.png";
var bigImg = $images.read(bigImgPath);
var smallImg = $images.read(smallImgPath);
let bigImgMat = bigImg.getMat(); // 大图
let smallImgMat = smallImg.getMat(); // 大图
3. 提取轮廓
contour_info(bigImgMat, bigImgContours);
contour_info(smallImgMat, smallImgContours);
4. 计算矩形度和宽高比
// 矩形度
let smallImgRectangularity = getRectangularity(smallImgContour);
// 宽高比
let smallImgAspectRatio = getAspectRatio(smallImgContour);
5. 设定矩形度上下限, 宽高比同理
let rectangularityUnit = 0.1;
let rectangularityLowerLimit =smallImgRectangularity - rectangularityUnit < 0 ? 0 : smallImgRectangularity - rectangularityUnit;
let rectangularityUpperLimit =smallImgRectangularity + rectangularityUnit > 1 ? 1 : smallImgRectangularity + rectangularityUnit;
6. 遍历大图的轮廓时, 比较轮廓特征
if (dist < distLimit) {// 矩形度let itemRectangularity = getRectangularity(item);if (1 || (itemRectangularity > rectangularityLowerLimit && itemRectangularity < rectangularityUpperLimit)) {// 宽高比let itemAspectRatio = getAspectRatio(item);if (1 || (itemAspectRatio > aspectRatioLowerLimit && itemAspectRatio < aspectRatioUpperLimit)) {相似的轮廓信息列表.push({dist: dist,area: area,itemRectangularity: itemRectangularity,itemAspectRatio: itemAspectRatio,contour: item,center: {x: centerX,y: centerY,},wh: {w: rotateRect.width,h: rotateRect.height,},});}}
}
7. 绘制轮廓和相似度
// cv::Scalar(v1, v2, v3, v4), 前面的三个参数是依次设置BGR的,和RGB相反,第四个参数设置图片的透明度
Imgproc.drawContours(bigImgMat, 排序后的轮廓list, -1, Scalar(0, 0, 255, 255), thickness, lineType);
Imgproc.putText(bigImgMat, content, ptTextBottomLeftPosition, fontFace, fontScale, Scalar(0, 0, 255, 255), thickness);
8. 查看mat对应的图片
let tempFilePath = files.join(files.getSdcardPath(), "脚本", "autojs查找轮廓相似的图片.png");
Imgcodecs.imwrite(tempFilePath, bigImgMat);
app.viewFile(tempFilePath);
bigImgMat.release();

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, 安卓文档, autojs文档, 最后才是群里问问
— 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

QQ群

747748653

完整源码

autojs查找轮廓相似的图片相关推荐

  1. autojs查找图片相似轮廓

    牙叔教程 简单易懂 使用场景 查找和已有图片相似的轮廓 效果展示 查找轮廓结果 原图 要查找的图片 autojs版本 8.8.16-0 autojs自带opencv3.4.3 脚本简介 主要使用mat ...

  2. python外包凹多边形生成_Python实现图片查找轮廓、多边形拟合、最小外接矩形代码...

    1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为: 2.测试代码: import cv2 import ...

  3. OpenCV查找轮廓

    转自:http://westice.javaeye.com/blog/721225 主要函数是       cvFindContours(tour_buf,storage,&contour,s ...

  4. 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍

    计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...

  5. 查找文件夹下图片的数量

    //查找文件夹下图片的数量\ private int getFiles(String string){int i=0;File file = new File(string);File[] files ...

  6. imutils基础(7)使用 OpenCV 查找轮廓中的极值点

    今天,我将使用 OpenCV 和 Python 根据轮廓查找极值点. 在本博客的其余部分,我将演示如何根据轮廓找到极北.极南.极东和极西 (x, y) 坐标,如本博文顶部的图像所示. 虽然这项技能本身 ...

  7. OpenCV使用findContours查找轮廓和相关函数——C++

    OpenCV使用findContours查找轮廓和相关函数--C++ findContours函数的使用 findContours函数的使用 //查找前景的区域 vector<vector< ...

  8. Python图片查找轮廓、多边形拟合、最小外接矩形操作实例

    1.概述 经常用到轮廓查找和多边形拟合等opencv操作,因此记录以备后续使用.本文代码中的阈值条件对图片没有实际意义,仅仅是为了测试. 原图为:                            ...

  9. autojs查找透明图

    牙叔教程 简单易懂 使用场景 查找图片中的透明按钮的位置 效果展示 透明按钮是齿轮按钮和双人按钮, 黄色矩形是找出来的位置 autojs版本 8.8.20-0 原理 观察图片, 可以明显的看到, 按钮 ...

最新文章

  1. 2022-2028年中国社区体育产业深度调研及投资前景预测报告
  2. 如何在一场面试中展现你对Python的coding能力?| 技术头条
  3. 微信小程序开源项目库汇总-持续更新
  4. mysql union all 别名_MySQL Union合并查询数据及表别名、字段别名用法分析
  5. MspEmu W.I.P.
  6. PhpStorm+Xdebug断点调试环境搭建
  7. 利用数组创建二叉树并赋值
  8. 你没有见过的 7 种 for 循环优化,超好用!
  9. 蜥蜴与地下室(51Nod-1489)
  10. C++之assert、NDEBUG探究
  11. 女生学电气or计算机,8个女生可以学习的工科专业,高三毕业生了解一下,值得报考...
  12. 关于市场调查分析与需求分析的心得
  13. [转] 背完这444句英语,你的口语绝对不成问题
  14. mysql 汉字拼音怎么获得_mysql汉字拼音取法
  15. mysql中如何复制数据表_MySQL中快速复制数据表方法汇总
  16. 计算机端口连接失败,电脑Telnet命令提示在端口23连接失败的解决办法
  17. 打开网页自动弹出QQ对话框的3种方法
  18. 使用FME进行GIS与CAD转换
  19. 《用递归法解决问题》教学设计
  20. postgresql 修改id的自增起始数

热门文章

  1. C++用桌面图标系列之三【整理-时钟】
  2. 基于微信小程序游泳馆管理系统(微信小程序毕业设计)
  3. 如何关掉苹果iMac开机启动声音
  4. NISP一级模拟题(一、二)
  5. 企业六大要素指标采集—人财物
  6. delphi使用TDelphiZXingQRCode生成二维码条形码
  7. linux shell -常用脚本
  8. 《iOS Human Interface Guidelines》——Terminology and Wording
  9. android动画知乎,GitHub - ryanhoo/Zhihu-Parallax-Animation: 知乎 Android 客户端启动页的视差动画效果实现...
  10. 1602液晶显示简易计算器