基于诸如 this 之类的资源,似乎人们使用 SIFT 的唯一方式是使用图书馆
#include <opencv2/nonfree/features2d.hpp>
我无法使用。我没有找到任何消息来源说 c++ opencv 中还有其他选项
有谁知道没有这个库就可以进行 SIFT 提取的方法吗?
我试过使用 opencv 中包含的这个库
#include
根据https://docs.opencv.org/4.x/d7/d60/classcv_1_1SIFT.html应该包含所需的SIFT功能
const cv::Mat input = cv::imread("my/file/path", 0); //Load as grayscale
cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keypoints;
detector.detect(input, keypoints);
// Add results to image and save.
cv::Mat output;
cv::drawKeypoints(input, keypoints, output);
for (int i = 0; i < 100; i++) {
imshow(window_name, output);
waitKey(50);
}
但是当我运行这个时,我得到一个异常,这可能意味着输出矩阵中没有存储任何内容
Unhandled exception at 0x00007FFFF808FE7C in CS4391_Project1.exe: Microsoft C++ exception: cv::Exception at memory location 0x00000008C15CF5C0.
据我所知,OpenCV 希望您动态创建特征检测器。例如,你可以这样做:
#include <opencv2/features2d.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
int main(int argc, char **argv) {
if (argc != 2) {
std::cerr << "Usage; sift <imagefile>\n";
return EXIT_FAILURE;
}
const int feature_count = 10; // number of features to find
const cv::Mat input = cv::imread(argv[1], 0);
cv::Ptr<cv::SiftFeatureDetector> detector =
cv::SiftFeatureDetector::create(feature_count);
std::vector<cv::KeyPoint> keypoints;
detector->detect(input, keypoints);
std::string window_name = "main";
cv::namedWindow(window_name);
cv::Mat output;
cv::drawKeypoints(input, keypoints, output);
cv::imshow(window_name, output);
cv::waitKey(0);
}
[在 Ubuntu 上测试,使用 OpenCV 4.5.4]
请注意,虽然它检测到的特征会在灰度图像上用颜色勾勒出轮廓,但它们有时非常小,因此您需要仔细观察才能找到它们。