如何使用 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::PtrMat 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 4.2 计算二进制图像的周长
如何在 Flutter 的原生 C++ 中使用 OpenCV 4(2021 年)(支持 Flutter 2.0)? [关闭]