OpenCV教程(48) 特征值匹配

简介: OpenCV中通过下面的代码,可以匹配两幅的图像的特征值。 // Read input images cv::Mat image1= cv::imread("../church01.

      OpenCV中通过下面的代码,可以匹配两幅的图像的特征值。

// Read input images
cv::Mat image1= cv::imread("../church01.jpg",0);
cv::Mat image2= cv::imread("../church02.jpg",0);
if (!image1.data || !image2.data)
    return 0;

// Display the images
cv::namedWindow("Right Image");
cv::imshow("Right Image",image1);
cv::namedWindow("Left Image");
cv::imshow("Left Image",image2);

// vector of keypoints
std::vector<cv::KeyPoint> keypoints1;
std::vector<cv::KeyPoint> keypoints2;

// Construction of the SURF feature detector
cv::SurfFeatureDetector surf(3000);

// Detection of the SURF features
surf.detect(image1,keypoints1);
surf.detect(image2,keypoints2);

std::cout << "Number of SURF points (1): " << keypoints1.size() << std::endl;
std::cout << "Number of SURF points (2): " << keypoints2.size() << std::endl;

// Draw the kepoints
cv::Mat imageKP;
cv::drawKeypoints(image1,keypoints1,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
cv::namedWindow("Right SURF Features");
cv::imshow("Right SURF Features",imageKP);
cv::drawKeypoints(image2,keypoints2,imageKP,cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
cv::namedWindow("Left SURF Features");
cv::imshow("Left SURF Features",imageKP);

// Construction of the SURF descriptor extractor
cv::SurfDescriptorExtractor surfDesc;

// Extraction of the SURF descriptors
cv::Mat descriptors1, descriptors2;
surfDesc.compute(image1,keypoints1,descriptors1);
surfDesc.compute(image2,keypoints2,descriptors2);

std::cout << "descriptor matrix size: " << descriptors1.rows << " by " << descriptors1.cols << std::endl;

// Construction of the matcher
cv::BruteForceMatcher<cv::L2<float>> matcher;

// Match the two image descriptors
std::vector<cv::DMatch> matches;
matcher.match(descriptors1,descriptors2, matches);

std::cout << "Number of matched points: " << matches.size() << std::endl;

std::nth_element(matches.begin(),    // initial position
    matches.begin()+24, // position of the sorted element
    matches.end());     // end position
// remove all elements after the 25th
matches.erase(matches.begin()+25, matches.end());

cv::Mat imageMatches;
cv::drawMatches(image1,keypoints1,  // 1st image and its keypoints
    image2,keypoints2,  // 2nd image and its keypoints
    matches,            // the matches
    imageMatches,        // the image produced
    cv::Scalar(255,255,255)); // color of the lines
cv::namedWindow("Matches");
cv::imshow("Matches",imageMatches);

程序执行后匹配图如下:
image

程序代码:工程FirstOpenCV51

相关文章
|
6月前
|
Windows 计算机视觉 Linux
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
该文档介绍了Qt的跨平台特性,并推荐在Windows和Linux开发中使用QtCreator。在Windows下添加动态库,可以通过Visual Studio配置.lib文件和.dll文件,或在QtCreator中使用&quot;添加库&quot;功能。在QtCreator中,选择库文件、包含路径,并配置Details,然后更新.pro文件,清除、qmake及构建项目。运行时确保.dll与.exe在同一目录下。
203 0
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
|
7月前
|
Linux 开发工具 计算机视觉
QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
Qt是跨平台的开发工具,推荐使用QtCreator进行Windows和Linux开发。在Windows下,使用Visual Studio创建动态库时,需要配置.lib文件并确保运行时.dll与.exe在同一目录。在QtCreator中添加DLL动态库,可以通过右键项目,选择添加库,然后在Details界面配置库文件、包含路径和平台,最后更新PRO文件并进行清除、qmake和构建步骤。运行时同样需确保.dll文件与可执行文件在同一目录。
212 5
|
Ubuntu 计算机视觉
Ubuntu新手友好:OpenCV 4.6.0安装的简化教程
网络首发,一定可以成功 依赖环境
309 0
|
编译器 网络虚拟化 C语言
2023年最全 Windows + VSCode 配置 OpenCV C++ 一站式开发调试环境教程
2023年最全 Windows + VSCode 配置 OpenCV C++ 一站式开发调试环境教程
2753 0
|
7月前
|
Ubuntu 计算机视觉
百度搜索:蓝易云【ubuntu下简单编译opencv教程。】
通过按照以上步骤进行,你应该能够成功在Ubuntu系统下编译和安装OpenCV。请注意,具体的步骤可能会因系统版本和OpenCV版本而有所不同。如果遇到任何问题,可以查阅OpenCV官方文档或社区寻求更多帮助。
62 0
|
7月前
|
C++ 计算机视觉
[软件配置] VS2012&QT5&Opencv的配置教程
[软件配置] VS2012&QT5&Opencv的配置教程
169 0
|
编译器 C语言 计算机视觉
Qt+OpenCV配置教程(图解亲测)
Qt+OpenCV配置教程(图解亲测)
1605 0
Qt+OpenCV配置教程(图解亲测)
|
编解码 算法 计算机视觉
2022年最新OpenCV函数实例及教程(三)
2022年最新OpenCV函数实例及教程
2022年最新OpenCV函数实例及教程(三)
|
算法 计算机视觉
2022年最新OpenCV函数实例及教程(二)
2022年最新OpenCV函数实例及教程
2022年最新OpenCV函数实例及教程(二)
|
资源调度 计算机视觉
2022年最新OpenCV函数实例及教程(一)
2022年最新OpenCV函数实例及教程
2022年最新OpenCV函数实例及教程(一)