资源简介

Windows环境使用VS2017编译opencv-4.2.0和opencv_contrib-4.2.0源码,支持TBB
包含x86和x64
https://blog.csdn.net/libaineu2004/article/details/104252289

资源截图

代码片段和文件信息

// cv420test.cpp : 此文件包含 “main“ 函数。程序执行将在此处开始并结束。
//

#include 
#include 
#include 
//原文链接:https://blog.csdn.net/libaineu2004/article/details/104252289

int main()
{
cv::Mat imageL = cv::imread(“origin_1.jpg“);
cv::Mat imageR = cv::imread(“origin_2.jpg“);
/*imshow(“1“ imageL);
imshow(“2“ imageR);
waitKey();
return 0;*/

//提取特征点方法
//SIFT
cv::Ptr sift = cv::xfeatures2d::SIFT::create();
//ORB
//cv::Ptr orb = cv::ORB::create();
//SURF
//cv::Ptr surf = cv::xfeatures2d::SURF::create();

//特征点
std::vector keyPointL keyPointR;
//单独提取特征点
sift->detect(imageL keyPointL);
sift->detect(imageR keyPointR);

//画特征点
cv::Mat keyPointImageL;
cv::Mat keyPointImageR;
drawKeypoints(imageL keyPointL keyPointImageL cv::Scalar::all(-1) cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(imageR keyPointR keyPointImageR cv::Scalar::all(-1) cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

//显示窗口
cv::namedWindow(“KeyPoints of imageL“);
cv::namedWindow(“KeyPoints of imageR“);

//显示特征点
cv::imshow(“KeyPoints of imageL“ keyPointImageL);
cv::imshow(“KeyPoints of imageR“ keyPointImageR);

//特征点匹配
cv::Mat despL despR;
//提取特征点并计算特征描述子
sift->detectAndCompute(imageL cv::Mat() keyPointL despL);
sift->detectAndCompute(imageR cv::Mat() keyPointR despR);

//Struct for DMatch: query descriptor index train descriptor index train image index and distance between descriptors.
//int queryIdx –>是测试图像的特征点描述符( descriptor )的下标,同时也是描述符对应特征点(keypoint)的下标。
//int trainIdx –> 是样本图像的特征点描述符的下标,同样也是相应的特征点的下标。
//int imgIdx –>当样本是多张图像的话有用。
//float distance –>代表这一对匹配的特征点描述符(本质是向量)的欧氏距离,数值越小也就说明两个特征点越相像。
std::vector matches;

//如果采用 flannbased 方法 那么 desp通过orb的到的类型不同需要先转换类型
if (despL.type() != CV_32F || despR.type() != CV_32F)
{
despL.convertTo(despL CV_32F);
despR.convertTo(despR CV_32F);
}

cv::PtrriptorMatcher> matcher = cv::DescriptorMatcher::create(“Flannbased“);
matcher->match(despL despR matches);

//计算特征点距离的最大值
double maxDist = 0;
for (int i = 0; i < despL.rows; i++)
{
double dist = matches[i].distance;
if (dist > maxDist)
maxDist = dist;
}

//挑选好的匹配点
std::vector< cv::DMatch > good_matches;
for (int i = 0; i < despL.rows; i++)
{
if (matches[i].distance < 0.5 * maxDist)
{
good_matches.push_back(matches[i]);
}
}

cv::Mat imageOutput;
cv::drawMatches(imageL keyPointL imageR keyPointR good_matches imageOutput);

cv::namedWindow(“picture of matching“);
cv::imshow(“picture of matching“ imageOutput);
cv::waitKey(0);

return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧:
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

评论

共有 条评论