OpenCV之图像匹配与定位

2023-12-27 05:15
文章标签 opencv 定位 图像匹配

本文主要是介绍OpenCV之图像匹配与定位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用图像特征的keypoints和descriptor来实现图像的匹配与定位。图像匹配算法主要有暴力匹配和FLANN匹配,而图像定位是通过图像匹配结果来反向查询它们在目标图片中的具体坐标位置。

以QQ登录界面为例,将整个QQ登录界面保存为QQ.png文件,QQ登录界面是在计算机的1920×1080分辨率下截图保存的;再把计算机的分辨率改为1280×1024,将QQ登录界面的用户头像保存并对图像进行旋转处理,最后保存为portrait.png文件

两张图片文件的像素分辨率和图像位置都发生了变化,如果要通过portrait.png去匹配定位它在QQ.png所在的坐标位置,自动化工具PyAutoGUI肯定是无法实现的。若想解决这种复杂的图像识别问题,只能使用计算机视觉技术。在OpenCV里面,QQ.png称为目标图像,portrait.png称为训练图像

实现过程:

(1)分别对两张图片的图像进行特征检测,图像特征检测算法有SURF、SIFT和ORB,两张图片必须使用同一种特征检测算法。
(2)根据两张图片的特征描述符(即变量descriptor)进行匹配,匹配算法有暴力匹配和FLANN匹配,不同的匹配算法所产生的匹配结果存在一定的差异。
(3)对两张图片的匹配结果进行数据清洗,去除一些错误匹配。错误匹配是由于在图片不同区域内出现多处相似的特征而导致的。
(4)在匹配结果里抽取中位数,利用中位数来反向查询它在目标图片所对应像素点的坐标位置,这个坐标位置也是自动化开发中使用的图片定位坐标。

线面是让chatgpt把上面图片里的代码修改为了c++。没仔细看是否正确。

#include <opencv2/opencv.hpp>
#include <vector>int main() {// Load imagescv::Mat img1 = cv::imread("QQ.png");cv::Mat img2 = cv::imread("portrait.png");// Use SIFT algorithm to get keypoints and descriptorscv::Ptr<cv::SIFT> sift = cv::SIFT::create();std::vector<cv::KeyPoint> kp1, kp2;cv::Mat des1, des2;sift->detectAndCompute(img1, cv::noArray(), kp1, des1);sift->detectAndCompute(img2, cv::noArray(), kp2, des2);// Define FLANN matchercv::Ptr<cv::FlannBasedMatcher> flann = cv::FlannBasedMatcher::create();std::vector<std::vector<cv::DMatch>> matches;flann->knnMatch(des1, des2, matches, 2);// Filter good matchesstd::vector<cv::DMatch> goodMatches;for (size_t i = 0; i < matches.size(); ++i) {if (matches[i][0].distance < 0.5 * matches[i][1].distance) {goodMatches.push_back(matches[i][0]);}}// Get coordinates of a pointsize_t index = goodMatches.size() / 2;float x = kp1[goodMatches[index].queryIdx].pt.x;float y = kp1[goodMatches[index].queryIdx].pt.y;// Draw rectangle on img1 at (x, y) and display imagecv::rectangle(img1, cv::Point2f(x, y), cv::Point2f(x + 5, y + 5), cv::Scalar(0, 255, 0), 2);cv::imshow("QQ", img1);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

这篇关于OpenCV之图像匹配与定位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/541978

相关文章

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传