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


问题内容

我在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);

问题答案:

如果从源代码编译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;

唯一的要求是您与源一起构建opencv_contrib可选模块(您可以从https://github.com/Itseez/opencv_contrib下载git项目,并仅在opencv的ccmake设置上设置其本地路径。

哦,请记住,SIFT和SURF是非免费软件^^;