web-dev-qa-db-ja.com

OpenCVSURF機能は実装されていません

サンプルを実行しようとするとfind_obj.cppまたは任意のOpenCVSURFプログラムコードの実行中にコマンドプロンプトで次のエラーが発生します。プロジェクトはエラーや警告なしでビルドされます。 VS2011ベータ版、OpenCV 2.4、windows7を使用しています。

エラーメッセージ:

OpenCV Error: The function/feature is not implemented < OpenCV was built without SURF support> in unknown function,file ..\..\..\src\opencv\modules\legacy\src\features2d.cpp, line 77

デバッグモードでCmake、次にVS2011を使用してOpenCV 2.4を再度ビルドしようとし、IDEにlibパスを追加しましたが、それでも結果が得られませんでした。

どうすれば修正できますか?

    #include <opencv2/objdetect/objdetect.hpp>
    #include <opencv2/features2d/features2d.hpp>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/legacy/legacy.hpp>
    #include <opencv2/legacy/compat.hpp>
    #include <opencv2/flann/flann.hpp>
    #include <opencv2/calib3d/calib3d.hpp>
    #include <opencv2/nonfree/features2d.hpp>
    #include <opencv2/nonfree/nonfree.hpp>

using namespace std;
using namespace cv;
int main()
{
    cv::initModule_nonfree();//THIS LINE IS IMPORTANT   

   IplImage *image1 = cvLoadImage("C:\\SURF\\1.jpg"); 
    IplImage *image2 = cvLoadImage("C:\\SURF\\2.jpg");

    CvMemStorage* memoryBlock = cvCreateMemStorage();
    CvSeq* image1KeyPoints;
    CvSeq* image1Descriptors;
    CvSeq* image2KeyPoints;
    CvSeq* image2Descriptors;

    // Only values with a hessian greater than 500 are considered for keypoints
   CvSURFParams params = cvSURFParams(500, 1);
   cvExtractSURF(image1, 0, &image1KeyPoints, &image1Descriptors, memoryBlock, params);
   cvExtractSURF(image2, 0, &image2KeyPoints, &image2Descriptors, memoryBlock, params);

   return 0;
}
10
rotating_image

この回答 (質問する前にグーグルで質問してみませんか?):

SIFTおよびSURFコードは、OpenCVv2.4でnonfreeという新しいモジュールに移動されました。 (WindlowsのDLL)にリンクしていることを確認してください。 Linuxでは、このライブラリはlibopencv_nonfree.soと呼ばれます。

10
ArtemStorozhuk

バグではありません。 SURFはnonfreeモジュールにあります。これを使用するには、nonfreeモジュールを初期化する必要があります。

    #include <opencv2/nonfree/nonfree.hpp> 
    ... 
    cv::initModule_nonfree();
8
erlingmusan

最近、私はSURFを学んでいます。この質問では、opencv_nonfree240d.libとopencv_nonfree240.libをプロジェクトのlibパスに追加できます。

3
fay

Ubuntuの場合、 https://help.ubuntu.com/community/OpenCV のスクリプトは、

libopencv_nonfree

sudo apt-getコマンドの最後まで、および

-D BUILD_opencv_nonfree = ON

cmakeコマンドの最後まで。それは私がソフトウェアセンターからopencvを扱っているのを見つけることができるすべてをアンインストールした後にのみ私のために働きました。ちなみに、ソフトウェアセンターにはopencv nonfreeライブラリ「libopencv-nonfree2.4」もありましたが、これは問題を解決するようには見えませんでした。私はそのようなことの専門家ではないので、私がしたことが100%正しいかどうかはわかりませんが、次のようなコマンドを使用できます

surf = cv2.SURF(400)

そして

キーポイント= surfDetector.detect(im)

以前はなかったものを実行します(最初のエラーは「見つかりません」タイプのエラーを引き起こし、2番目のエラーはセグメンテーション違反を引き起こしました)。

http://Pastebin.com/sQzDdx5i に貼り付けられた非フリーのsurf/siftを使用できるようにしたopencv.shのバージョン
現在機能しているバージョンはopencv-2.4.9ですが、スクリプトはlib名と同様にやや不可知論的であるように思われるため、他のバージョンでも機能する可能性があります。

0
jeremy_rutman