小白评测opencv-ORB

简介: 牙叔教程 简单易学

牙叔教程 简单易学


使用场景


orb适用于简单的图片查找, 比如一些纯色和形状比较单一的图片, 即使缩放旋转都可以找到;


如果是游戏这种, 色彩丰富的图片, 并且有山水天, 等等复杂地形的图片, 就不能用了


简单的图片, 效果尚可





复杂的图片, 特征点都找到四面八方去了


这个是找中间顶部的女生头像



这个是找右侧的点赞按钮



这个是找点赞按钮



autojs版本


8.8.10-0


代码讲解


1. 初始化opencv, 不加这个会报错
runtime.images.initOpenCvIfNeeded();


2. 导入用到的类
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.DescriptorExtractor);
importClass(org.opencv.features2d.DescriptorMatcher);
importClass(org.opencv.features2d.FeatureDetector);
importClass(org.opencv.features2d.Features2d);


3. 设置图片路径
// let bigImgPath1 = "./图片素材/测试_缩小一半.png";
// let smallImgPath = "./图片素材/测试小图.png";
// let bigImgPath1 = "./图片素材/测试小图.png";
// let smallImgPath = "./图片素材/测试小图.png";
// let bigImgPath1 = "./图片素材/game001.png";
// let smallImgPath = "./图片素材/game001_女生头像.png";
// let bigImgPath1 = "./图片素材/dy1.png";
// let smallImgPath = "./图片素材/dy1_心_带背景.png";
let bigImgPath1 = "./图片素材/dy1_右侧.png";
let smallImgPath = "./图片素材/dy1_心_带背景.png";


4. 对比两张图片
compareImages(bigImgPath1, smallImgPath);


自定义函数compareImages


1. 保证是绝对路径
bigImgPath1 = files.path(bigImgPath1);
smallImgPath = files.path(smallImgPath);


2. 初始化一些变量
var detector = FeatureDetector.create(FeatureDetector.ORB);
var descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
var matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);


3. 计算图片特征
// 处理大图
var bigImg = Imgcodecs.imread(bigImgPath1);
var descriptors1 = new Mat();
var keyPoints1 = new MatOfKeyPoint();
detector.detect(bigImg, keyPoints1);
descriptor.compute(bigImg, keyPoints1, descriptors1);
// 处理小图
var smallImg = Imgcodecs.imread(smallImgPath);
var descriptors2 = new Mat();
var keyPoints2 = new MatOfKeyPoint();
detector.detect(smallImg, keyPoints2);
descriptor.compute(smallImg, keyPoints2, descriptors2);


4. 匹配特征点
var matches = new MatOfDMatch();
matcher.match(descriptors1, descriptors2, matches);


5. 提取前200个特征点
// 排序
var mats = matches.toArray();
function compareNumbers(a, b) {
  return a.distance - b.distance;
}
mats.sort(compareNumbers);
// 提取最佳匹配
let num = 200;
var goodMatch = new LinkedList();
let tempArr = mats.slice(0, mats.length >= num ? num : mats.length);
tempArr.map((item) => {
  goodMatch.add(item);
});
matches.fromList(goodMatch);


6. 画特征点
var dst = new Mat();
Features2d.drawMatches(bigImg, keyPoints1, smallImg, keyPoints2, matches, dst);
let tempFilePath = files.join(files.getSdcardPath(), "脚本", "orb.png");
Imgcodecs.imwrite(tempFilePath, dst);


7. 释放资源
bigImg.release();
descriptors1.release();
smallImg.release();
descriptors2.release();
dst.release();


8. 查看图片
app.viewFile(tempFilePath);


完整源码

公众号回复  obr

感谢大佬分享ORB例子



声明

部分内容来自网络

本教程仅用于学习, 禁止用于其他用途








相关文章
|
9月前
|
计算机视觉
使用计算机视觉实战项目精通 OpenCV:1~5
使用计算机视觉实战项目精通 OpenCV:1~5
283 0
|
8月前
|
算法 计算机视觉 Python
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像
openCV 3计算机视觉 Python语言实现 笔记 第三章 使用OpenCV 3处理图像
|
9月前
|
计算机视觉
CV项目肢体动作识别(三)内附完整代码和详细讲解
首先我还是给出完整的代码,然后再进行详细的讲解。这一次我们用模块化的思想,把一个功能模块化(moudle),这种思想在工程中非常常见,在分工中你需要做好自己的工作就可以,最后再调用这些模块。
115 1
|
机器学习/深度学习 TensorFlow 算法框架/工具
计算机视觉实战(十七)OpenCV的DNN模型 (附完整代码)
计算机视觉实战(十七)OpenCV的DNN模型 (附完整代码)
320 0
|
机器学习/深度学习 算法 固态存储
10分钟学会使用YOLO及Opencv实现目标检测(下)|附源码
本文介绍使用opencv和yolo完成视频流目标检测,代码解释详细,附源码,上手快。
9161 1
|
机器学习/深度学习 计算机视觉 Python
|
机器学习/深度学习 数据可视化 PyTorch
手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)
今天和大家一起来看一下在LabVIEW中如何使用OpenCV DNN模块实现手写数字识别
233 0
|
算法 计算机视觉 索引
数字图像处理OpenCV——实验一 熟悉OpenCV环境和基本操作
实验一 熟悉OpenCV环境和基本操作 熟悉OpenCV运行环境,了解图像的基本操作及直方图均衡化。 利用OpenCV产生一幅图像,尺寸为200*240,三通道,其中某一块为红色,其它皆为黑色,示例图如下。 对一副图像进行直方图均衡化处理。要求自行编写直方图均衡化函数,实现图像灰度均衡的算法步骤如下: (1) 统计直方图数组,用一个数组p记录p[i]; (2) i从1开始,令S[i]=S[i-1]+p[i],S[0]=p[0]; (3) 一个数组L记录新的S索引值,即令L[i]=S[i]*(256-1);
372 0
数字图像处理OpenCV——实验一 熟悉OpenCV环境和基本操作
|
算法 定位技术 计算机视觉
Python opencv图像处理基础总结(七) 基于分水岭算法的图像分割
任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝。不停地灌水,不停地构建堤坝知道所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割
459 0
Python opencv图像处理基础总结(七) 基于分水岭算法的图像分割
|
Python 计算机视觉 C++
【视觉与图像】Python+OpenCV教程入门篇
本教程翻译自OpenCV官方英文教程,按照使用度和难易度翻译,重新编写了大量原创内容,将不常用和较难的部分写成番外篇,浅显易懂,很easy的辣~每节的源码、图片和练习题答案均可在引用处找到
19660 1