当前位置: 代码网 > it编程>软件设计>算法 > 【CV】opencv特征匹配算法

【CV】opencv特征匹配算法

2024年08月06日 算法 我要评论
特征匹配是计算机视觉领域中的一项关键任务,它用于在不同图像中寻找相似的特征点,并将它们进行匹配。这些特征点可以是图像中的角点、边缘、斑点等,在不同的图像中可能因为旋转、缩放、光照变化等因素发生变化。在OpenCV中,提供了多种特征匹配算法,其中包括ORB、SIFT、SURF、KAZE、AKAZE等。接下来,简要介绍这些算法,主要给出OpenCV示例。这里挖个坑,每个算法原理后续再填。

特征匹配是计算机视觉领域中的一项关键任务,它用于在不同图像中寻找相似的特征点,并将它们进行匹配。这些特征点可以是图像中的角点、边缘、斑点等,在不同的图像中可能因为旋转、缩放、光照变化等因素发生变化。

在opencv中,提供了多种特征匹配算法,其中包括orb、sift、surf、kaze、akaze等。接下来,简要介绍这些算法,主要给出opencv示例。这里挖个坑,每个算法原理后续再填

orb (oriented fast and rotated brief)

orb是一种高效的特征提取和描述符算法,它结合了fast关键点检测器和brief描述符算法。orb算法具有良好的旋转不变性和尺度不变性,并且计算速度较快,适用于实时应用场景。

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    mat img1 = imread("image1.jpg", imread_grayscale);
    mat img2 = imread("image2.jpg", imread_grayscale);

    ptr<orb> orb = orb::create();
    vector<keypoint> keypoints1, keypoints2;
    mat descriptors1, descriptors2;

    orb->detectandcompute(img1, mat(), keypoints1, descriptors1);
    orb->detectandcompute(img2, mat(), keypoints2, descriptors2);

    // 进行特征点匹配
    bfmatcher matcher(norm_hamming);
    vector<dmatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // 绘制匹配结果
    mat img_matches;
    drawmatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    
    imshow("matches", img_matches);
    waitkey(0);

    return 0;
}

sift (scale-invariant feature transform)

sift是一种基于尺度空间的特征提取和描述符算法,具有良好的旋转和尺度不变性,但计算速度较慢。它是一种经典的特征匹配算法,在许多应用中仍然被广泛使用。

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    mat img1 = imread("image1.jpg", imread_grayscale);
    mat img2 = imread("image2.jpg", imread_grayscale);

    ptr<sift> sift = sift::create();
    vector<keypoint> keypoints1, keypoints2;
    mat descriptors1, descriptors2;

    sift->detectandcompute(img1, mat(), keypoints1, descriptors1);
    sift->detectandcompute(img2, mat(), keypoints2, descriptors2);

    // 进行特征点匹配
    bfmatcher matcher;
    vector<dmatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // 绘制匹配结果
    mat img_matches;
    drawmatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    
    imshow("matches", img_matches);
    waitkey(0);

    return 0;
}

surf (speeded-up robust features)
surf是一种基于快速hessian矩阵检测的特征提取算法,它具有比sift更快的计算速度,但牺牲了一些旋转不变性。surf适用于对速度要求较高的应用场景。

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    mat img1 = imread("image1.jpg", imread_grayscale);
    mat img2 = imread("image2.jpg", imread_grayscale);

    ptr<surf> surf = surf::create();
    vector<keypoint> keypoints1, keypoints2;
    mat descriptors1, descriptors2;

    surf->detectandcompute(img1, mat(), keypoints1, descriptors1);
    surf->detectandcompute(img2, mat(), keypoints2, descriptors2);

    // 进行特征点匹配
    bfmatcher matcher;
    vector<dmatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // 绘制匹配结果
    mat img_matches;
    drawmatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    
    imshow("matches", img_matches);
    waitkey(0);

    return 0;
}

kaze (accelerated-kaze)

kaze是一种快速的特征提取算法,它在保持较好旋转和尺度不变性的同时,具有更快的计算速度。kaze适用于对计算资源要求较高的应用场景。

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    mat img1 = imread("image1.jpg", imread_grayscale);
    mat img2 = imread("image2.jpg", imread_grayscale);

    ptr<kaze> kaze = kaze::create();
    vector<keypoint> keypoints1, keypoints2;
    mat descriptors1, descriptors2;

    kaze->detectandcompute(img1, mat(), keypoints1, descriptors1);
    kaze->detectandcompute(img2, mat(), keypoints2, descriptors2);

    // 进行特征点匹配
    bfmatcher matcher(norm_l2);
    vector<dmatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // 绘制匹配结果
    mat img_matches;
    drawmatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
    
    imshow("matches", img_matches);
    waitkey(0);

    return 0;
}

akaze (accelerated-kaze)

akaze是kaze的改进版本,它在保持计算速度的同时,进一步提升了匹配的性能。akaze适用于对性能要求较高的实时应用场景。

#include <opencv2/opencv.hpp>

using namespace cv;

int main() {
    // 读取两张图像
    mat image1 = imread("image1.jpg");
    mat image2 = imread("image2.jpg");

    // 检查图像是否成功读取
    if (image1.empty() || image2.empty()) {
        std::cerr << "error: unable to load images." << std::endl;
        return -1;
    }

    // 创建 akaze 特征检测器
    ptr<akaze> akaze = akaze::create();

    // 检测特征点和描述符
    std::vector<keypoint> keypoints1, keypoints2;
    mat descriptors1, descriptors2;
    akaze->detectandcompute(image1, noarray(), keypoints1, descriptors1);
    akaze->detectandcompute(image2, noarray(), keypoints2, descriptors2);

    // 创建 bfmatcher
    bfmatcher matcher(norm_hamming);

    // 在第一张图像中的每个特征点上寻找最佳匹配
    std::vector<dmatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // 绘制匹配结果
    mat img_matches;
    drawmatches(image1, keypoints1, image2, keypoints2, matches, img_matches);

    // 显示匹配结果
    imshow("matches", img_matches);
    waitkey(0);

    return 0;
}

python 调用opencv 方法类似

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com