SURF和SIFT算法在OpenCV 3.0 Java中不起作用

Bah*_*dil 9 java opencv

我在Java中使用OpenCV 3.0(最新版本),但是当我使用SURF算法或SIFT算法时它不起作用并抛出Exception,它说: OpenCV Error: Bad argument (Specified feature detector type is not supported.) in cv::javaFeatureDetector::create

我用谷歌搜索了,但是给出这类问题的答案并没有解决我的问题.如果有人知道这个问题,请告诉我.

提前致谢!

更新:第三行中的代码抛出异常.

        Mat img_object = Imgcodecs.imread("data/img_object.jpg");
        Mat img_scene = Imgcodecs.imread("data/img_scene.jpg");

        FeatureDetector detector = FeatureDetector.create(FeatureDetector.SURF);
        MatOfKeyPoint keypoints_object = new MatOfKeyPoint();
        MatOfKeyPoint keypoints_scene = new MatOfKeyPoint();

        detector.detect(img_object, keypoints_object);
        detector.detect(img_scene, keypoints_scene);
Run Code Online (Sandbox Code Playgroud)

Lak*_*ake 9

如果从源代码编译OpenCV,则可以通过自己编辑opencv/modules/features2d/misc/java/src/cpp/features2d_manual.hpp来修复缺少的绑定.

我通过进行以下更改来修复它:

(line 6)
#ifdef HAVE_OPENCV_FEATURES2D
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
#include "features2d_converters.hpp"

...(line 121)
    case SIFT:
    fd = xfeatures2d::SIFT::create();
    break;
    case SURF:
    fd = xfeatures2d::SURF::create();
    break;

...(line 353)
    case SIFT:
        de = xfeatures2d::SIFT::create();
        break;
    case SURF:
        de = xfeatures2d::SURF::create();
        break;
Run Code Online (Sandbox Code Playgroud)

唯一的要求是你和你的源一起构建opencv_contrib可选模块(你可以从https://github.com/Itseez/opencv_contrib下载git项目,只需在opencv的ccmake设置上设置它的本地路径.

哦,请记住,SIFT和SURF是非自由软件^^;


Cri*_* HG 7

这是因为它们不适用于较新版本的OpenCV(3+).我不久前遇到了这个问题.你必须:

  1. 下载OpenCV(如果还没有)
  2. opencv github repo下载nonfree部分
  3. cmake -DBUILD_SHARED_LIBS=OFF使用DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules选项指定非自由部分生成makefile 并使用make -j8(或您使用的任何Java版本)进行构建
  4. 编辑features2d_manual.hpp文件,包括opencv2/xfeatures2d.hpp并包含SIFT和SURF的必要代码case,这些代码已注释且未定义: fd=xfeatures2d::SIFT::create();用于SIFT描述符和de = xfeatures2d::SIFT::create();SIFT提取器.如果您也想使用它,请对SURF执行相同的操作.

我写这篇文章一步一步解释如何编译非自由的OpenCV部分,以便使用像SIFT或SURF这样的私有工具. 编译OpenCV非自由部分