Основываясь на таких источниках, как это, кажется, что единственный способ, которым люди используют SIFT, — это библиотека.
#include <opencv2/nonfree/features2d.hpp>
которым я не умею пользоваться. Я не нашел никаких источников, говорящих о том, что в С++ opencv есть другие варианты
Кто-нибудь знает способ извлечения SIFT без этой библиотеки?
Я пытался использовать эту библиотеку, включенную в opencv.
#include <opencv2/features2d.hpp>
который согласно 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.
@Micka да - я приложил ссылку из opencv, в которой говорится, что когда я использую библиотеку, которую они предлагают бесплатно, мой код не работает, и мне интересно, почему
Какую версию opencv вы используете? cv::getBuildEnvironment()
Я не думаю, что исключение вызвано использованием вами просеивания, для этого нет никаких указаний. Для начала предлагаю вам создать минимальный воспроизводимый пример . Запустите этот код в отладчике, чтобы проверить, что он делает. Как новый пользователь здесь, также пройдите тур и прочитайте Как спросить.
Насколько я знаю, 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]
Обратите внимание: несмотря на то, что обнаруженные объекты будут выделены цветом на изображении в градациях серого, иногда они бывают довольно маленькими, поэтому вам нужно внимательно посмотреть, чтобы найти их.
Разве просеивание не было переведено из несвободного в бесплатное после окончания действия патента?