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++。没仔细看是否正确。

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <vector>

int main() {
    // Load images
    cv::Mat img1 = cv::imread("QQ.png");
    cv::Mat img2 = cv::imread("portrait.png");

    // Use SIFT algorithm to get keypoints and descriptors
    cv::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 matcher
    cv::Ptr<cv::FlannBasedMatcher> flann = cv::FlannBasedMatcher::create();
    std::vector<std::vector<cv::DMatch>> matches;
    flann->knnMatch(des1, des2, matches, 2);

    // Filter good matches
    std::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 point
    size_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 image
    cv::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;
}
相关推荐
拥抱AGI几秒前
我说大模型微调没啥技术含量,谁赞成谁反对?
人工智能·学习·语言模型·大模型学习·大模型入门·大模型教程
aqymnkstkw2 分钟前
2024年【电气试验】考试题库及电气试验模拟试题
大数据·c语言·人工智能·嵌入式硬件·安全
2401_85044049721 分钟前
激发AI创造力:掌握Prompt提示词的高效提问方法
人工智能·prompt
Terry Cao 漕河泾1 小时前
SRT3D: A Sparse Region-Based 3D Object Tracking Approach for the Real World
人工智能·计算机视觉·3d·目标跟踪
多猫家庭1 小时前
宠物毛发对人体有什么危害?宠物空气净化器小米、希喂、352对比实测
人工智能·宠物
AI完全体1 小时前
AI小项目4-用Pytorch从头实现Transformer(详细注解)
人工智能·pytorch·深度学习·机器学习·语言模型·transformer·注意力机制
AI知识分享官1 小时前
智能绘画Midjourney AIGC在设计领域中的应用
人工智能·深度学习·语言模型·chatgpt·aigc·midjourney·llama
程序小旭2 小时前
Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019
人工智能·目标检测·计算机视觉
阿利同学2 小时前
yolov8多任务模型-目标检测+车道线检测+可行驶区域检测-yolo多检测头代码+教程
人工智能·yolo·目标检测·计算机视觉·联系 qq1309399183·yolo多任务检测·多检测头检测
CV-King2 小时前
计算机视觉硬件知识点整理(三):镜头
图像处理·人工智能·python·opencv·计算机视觉