如何使用 C++ 在 OpenCV 4.2.0 中使用 SIFT? [关闭]

Posted

技术标签:

【中文标题】如何使用 C++ 在 OpenCV 4.2.0 中使用 SIFT? [关闭]【英文标题】:How do I use SIFT in OpenCV 4.2.0 with C++? [closed] 【发布时间】:2021-12-09 18:14:57 【问题描述】:

我正在使用 Visual Studio 2017。安装了 4.2.0 的 Opencv 和 opencv 版本,并使用 cmake 生成文件。 xfeatured2d420.lib 与编译器链接。还有#include“opencv2/xfeatures2d.hpp” #include "opencv2/xfeatures2d/nonfree.hpp" 包括在内。使用 xfeatures2d::Sift 提取特征给我内存错误。我需要从两个图像中计算筛选关键点。

【问题讨论】:

cv::Ptr f2d = xfeatures2d::SIFT::create();此时内存错误 std::vector keypoints_1, keypoints_2; f2d->检测(帧,关键点_1); f2d->detect(frame2, keypoints_2); 您的帖子需要包含minimal reproducible example。 编辑您的问题。确保将代码格式化/样式化为代码。不要将其保留为文本。 请提供足够的代码,以便其他人更好地理解或重现问题。 Mat img_1 = imread("C:/Users/Dan/Desktop/0.jpg", 1); Mat img_2 = imread("C:/Users/Dan/Desktop/0.jpg", 1); cv::Ptr f2d = xfeatures2d::SIFT::create(); std::vector keypoints_1, keypoints_2; f2d->检测(img_1,关键点_1); f2d->检测(img_2,关键点_2);垫描述符_1,描述符_2; f2d->计算(img_1,关键点_1,描述符_1); f2d->计算(img_2,关键点_2,描述符_2); BFMatcher 匹配器; std::vector 匹配; matcher.match(descriptors_1, descriptors_2, 匹配); 由于太长,我无法发布整个代码。我正在使用这个例子***.com/questions/38971426/… 【参考方案1】:
Mat img_1 = imread("C:/Users/Dan/Desktop/0.jpg", 1);   
Mat img_2 = imread("C:/Users/Dan/Desktop/0.jpg", 1);
cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); 
std::vector<KeyPoint> keypoints_1, keypoints_2; 
f2d->detect(img_1, keypoints_1); 
f2d->detect(img_2, keypoints_2); 
Mat descriptors_1, descriptors_2; 
f2d->compute(img_1, keypoints_1, descriptors_1); 
f2d->compute(img_2, keypoints_2, descriptors_2); 
BFMatcher matcher; 
std::vector< DMatch > matches; matcher.match(descriptors_1, 
descriptors_2, matches); 
vector<cv::DMatch> good_matches;
for (int i = 0; i < matches.size(); ++i)

    const float ratio = 0.8; 
    if (matches[i][0].distance < ratio * matches[i] 
 [1].distance)
                
                good_matches.push_back(matches[i][0]);
                
    

vector<Point2f> points1, points2;
for (int i = 0; i < good_matches.size(); i++)
    
            //-- Get the keypoints from the good matches
             
        points1.push_back(keypoints_1[good_matches[i].queryIdx].pt);
             
        points2.push_back(keypoints_2[good_matches[i].trainIdx].pt);
    

        /* Find Homography */
Mat H = findHomography(Mat(points2), Mat(points1), RANSAC);

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 这似乎是对您的问题的修正,而不是答案。请查看tour 以了解该网站的运作方式。

以上是关于如何使用 C++ 在 OpenCV 4.2.0 中使用 SIFT? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 中使用 C++ opencv highgui 将活动窗口设置为 opencv 图像

c++中如何调用opencv库

如何在 C++ 中使用 OpenCV 4.2 计算二进制图像的周长

如何在 Flutter 的原生 C++ 中使用 OpenCV 4(2021 年)(支持 Flutter 2.0)? [关闭]

如何使用 c++ 在带有 opencv 3.0.0 的视频中画一条线

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?