如何在opencv中使用SIFT

问题描述 投票:0回答:5

这几天我在学习C++和OpenCV。给定一张图像,我想提取它的 SIFT 特征。从http://docs.opencv.org/modules/nonfree/doc/feature_detection.html,我们可以知道OpenCV 2.4.8有SIFT模块。 看这里: enter image description here

但我不知道如何使用它。目前,要使用 SIFT,我需要首先调用 SIFT 类来获取 SIFT 实例。然后,我需要使用

SIFT::operator()()
进行SIFT。

但是

OutputArray
InputArray
KeyPoint
是什么?谁能提供一个演示来展示如何使用
SIFT
类进行SIFT?

c++ opencv sift
5个回答
18
投票

参见 使用 OpenCV 2.2 实现 Sift 的示例

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp> //Thanks to Alessandro

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread("input.jpg", 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);
    cv::imwrite("sift_result.jpg", output);

    return 0;
}

在 OpenCV 2.4.8 上测试


7
投票

OpenCV 4.2.0 更新(当然,不要忘记链接 opencv_xfeatures2d420.lib)

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/xfeatures2d.hpp>

int main(int argc, char** argv)
{
    const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale

    cv::Ptr<cv::xfeatures2d::SIFT> siftPtr = cv::xfeatures2d::SIFT::create();
    std::vector<cv::KeyPoint> keypoints;
    siftPtr->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);it.

    return 0;
}

5
投票

OpenCV3 更新

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp> //Thanks to Alessandro

int main(int argc, const char* argv[])
{
    const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale

    cv::Ptr<cv::SiftFeatureDetector> detector = cv::SiftFeatureDetector::create();
    std::vector<cv::KeyPoint> keypoints;
    detector->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);

    return 0;
}

0
投票

我对 opencv3 有同样的问题,但我发现了this。它解释了为什么 SIFT 和 SURF 从 OpenCV 3.0 的默认安装中删除以及如何在 OpenCV 3 中使用 SIFT 和 SURF。

opencv_contrib
中的算法和相关实现默认情况下不会安装,您需要在编译和安装 OpenCV 时显式启用它们才能访问它们。

他们将搬到

xfeatures2d
图书馆。
#include <opencv2/xfeatures2d.hpp>


0
投票

OpenCv 4.5 的更新以及那些(比如我)不知道的人快速将 @mcy 的评论翻译成代码。

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/features2d.hpp>

int main(int argc, char** argv)
{
    const cv::Mat input = cv::imread("input.jpg", 0); //Load as grayscale

    cv::Ptr<cv::SIFT> siftPtr = cv::SIFT::create();
    std::vector<cv::KeyPoint> keypoints;
    siftPtr->detect(input, keypoints);

    // Add results to image and save.
    cv::Mat output;
    cv::drawKeypoints(input, keypoints, output);
    cv::imwrite("sift_result.jpg", output);

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.