opencv中的SIFT算法问题

不怨天,不尤人 2020-12-22 09:18:57
已经使用Cmake配置好了opencv_contrib-4.1.0,但在使用SIFT算法时还是会出现错误“无法解析的外部命令”


#include <iostream>
#include <vector>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>
#include <opencv2/highgui.hpp>
//#include <opencv2/xfeatures2d/nonfree.hpp> //OpenCV 4.2.0 及之后版本
using namespace cv::xfeatures2d;
using namespace cv;
using namespace std;
int main()
{
cv::Mat imageL = cv::imread("imgL.bmp");
cv::Mat imageR = cv::imread("imgR.bmp");


//提取特征点方法
//SIFT
//cv::Ptr<cv::xfeatures2d::SIFT> sift = cv::xfeatures2d::SIFT::create();
//cv::Ptr<cv::SIFT> sift = cv::SIFT::Creat(); //OpenCV 4.4.0 及之后版本
//ORB
//cv::Ptr<cv::ORB> orb = cv::ORB::create();
//SURF
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create();

//特征点
std::vector<cv::KeyPoint> keyPointL, keyPointR;
//单独提取特征点
surf->detect(imageL, keyPointL);
surf->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;
//提取特征点并计算特征描述子
surf->detectAndCompute(imageL, cv::Mat(), keyPointL, despL);
surf->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<cv::DMatch> matches;

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

cv::Ptr<cv::DescriptorMatcher> 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;
}


不知道是什么原因,所以没有解决的思路。。。。。。。
...全文
305 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-08
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10993204.html
友善啊,朋友 2021-01-07
  • 打赏
  • 举报
回复
SIFT在这个版本是有知识产权的,默认不可用 ,最新版本的OpenCV知识产权到期了 你换成最新版本的OpenCV就好了
  • 打赏
  • 举报
回复
ORB可以用,SIFT不能用,那个注释是不对的
一颗白面馒头 2020-12-31
  • 打赏
  • 举报
回复
是只有sift不能用,还是别的也不能用?如果别的也不能用有可能是你没配置环境变量? 还有你说的配置好的拓展包是4.1.0的,代码注释说opencv是4.2.0?
  • 打赏
  • 举报
回复
但是我看了,我的版本是对应的啊
一颗白面馒头 2020-12-23
  • 打赏
  • 举报
回复
opencv和拓展包的版本要对应,
Ptr<xfeatures2d::SiftFeatureDetector> sift = xfeatures2d::SiftFeatureDetector::create();

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧