web-dev-qa-db-ja.com

opencvでSIFTを使用する方法

最近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を実行する必要があります。

しかし、OutputArrayInputArrayKeyPointとは何ですか?誰かがSIFTクラスを使用してSIFTを実行する方法を示すデモを提供できますか?

11
tqjustc

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でテスト済み

17
Liam McInroy

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;
}
1
lbsweek

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;
}
0
Julien Busset

私はopencv3について同じ質問をしていましたが、 this が見つかりました。 OpenCV 3.0のデフォルトインストールからSIFTとSURFが削除された理由と、OpenCV 3でSIFTとSURFを使用する方法について説明します。

opencv_contribのアルゴリズムと関連する実装はデフォルトではインストールされません。OpenCVをコンパイルおよびインストールしてそれらにアクセスするには、これらを明示的に有効にする必要があります。

それらはxfeatures2dライブラリに移動しています。
#include <opencv2/xfeatures2d.hpp>

0
Yirga