C++ opencv进行图像匹配

3 篇文章 0 订阅

步骤
加载图像:加载待匹配的图像和要搜索的模板图像。
**特征检测:**使用关键点检测算法(如SIFT、SURF、ORB等)检测图像中的关键点。
描述符计算:计算每个关键点的描述符,描述符是一个向量,用于描述关键点周围的图像信息。
**特征匹配:**将模板图像的特征描述符与待匹配图像的特征描述符进行匹配,找到最佳匹配点。
**绘制匹配结果:**可选,将匹配结果可视化,例如绘制匹配的关键点或者画出匹配的线段。

示例代码:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace cv;

int main() {
    // 加载图像
    Mat img_scene = imread("image1.jpg", IMREAD_GRAYSCALE);
    Mat img_object = imread("image2.jpg", IMREAD_GRAYSCALE);
    
    if (img_scene.empty() || img_object.empty()) {
        std::cerr << "Error loading images!" << std::endl;
        return -1;
    }
    
    // 定义特征检测器和描述符提取器
    Ptr<Feature2D> detector = SIFT::create();
    std::vector<KeyPoint> keypoints_scene, keypoints_object;
    Mat descriptors_scene, descriptors_object;
    
    // 检测关键点和计算描述符
    detector->detectAndCompute(img_scene, Mat(), keypoints_scene, descriptors_scene);
    detector->detectAndCompute(img_object, Mat(), keypoints_object, descriptors_object);
    
    // 定义匹配器
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::FLANNBASED);
    std::vector<DMatch> matches;
    
    // 进行匹配
    matcher->match(descriptors_object, descriptors_scene, matches);
    
    // 绘制匹配结果
    Mat img_matches;
    drawMatches(img_object, keypoints_object, img_scene, keypoints_scene,
                matches, img_matches, Scalar::all(-1), Scalar::all(-1),
                std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
    
    // 显示结果
    imshow("Matches", img_matches);
    waitKey(0);
    
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用OpenCV中的模板匹配函数进行图像多模板匹配。该函数需要输入待匹配图像和模板图像,并返回匹配结果的坐标信息。以下是一个基于C语言和OpenCV的图像多模板匹配的示例代码: #include <opencv2/highgui/highgui_c.h> #include <opencv2/imgproc/imgproc_c.h> void multi_template_match(IplImage* src, IplImage* tem[], int n_template) { // Define match method and threshold int match_method = CV_TM_CCOEFF_NORMED; double threshold = 0.8; // Loop through all templates and perform matching for (int i = 0; i < n_template; i++) { IplImage* result = cvCreateImage(cvSize(src->width - tem[i]->width + 1, src->height - tem[i]->height + 1), IPL_DEPTH_32F, 1); cvMatchTemplate(src, tem[i], result, match_method); // Find best match CvPoint max_loc; double max_val; cvMinMaxLoc(result, 0, &max_val, 0, &max_loc, 0); if (max_val >= threshold) { // Draw rectangle around matched area cvRectangle(src, cvPoint(max_loc.x, max_loc.y), cvPoint(max_loc.x + tem[i]->width, max_loc.y + tem[i]->height), CV_RGB(255, 0, 0), 2); } cvReleaseImage(&result); } } int main() { // Load source image and templates IplImage* src = cvLoadImage("source.jpg"); IplImage* tem[2]; tem[0] = cvLoadImage("template1.jpg"); tem[1] = cvLoadImage("template2.jpg"); // Perform multi-template matching multi_template_match(src, tem, 2); // Show result image cvShowImage("Result", src); cvWaitKey(0); // Release resources cvReleaseImage(&src); cvReleaseImage(&tem[0]); cvReleaseImage(&tem[1]); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值