Ask Your Question
1

error Descriptor SURF c++ OpenCV on Android

asked 2013-03-15 05:07:37 -0500

Marwen Z gravatar image

updated 2013-03-15 05:58:36 -0500

berak gravatar image

HI when I try to call a native method Features2D + Homography to find a known object I had errors telque

double dist = matches[i].distance;
matches[i].distance < 3*min_dist
good_matches.push_back( matches[i]);

line

console :

Compile++ thumb : native_sample <= jni_part.cpp Prebuilt : libgnustl_static.a <= <ndk>/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/ SharedLibrary : libnative_sample.so Install : libnative_sample.so => libs/armeabi-v7a/libnative_sample.so mirlo06@mirlo06-Satellite-L500:~/OpenCV4android/samples/tutorial-3-native$ /opt/android-ndk/ndk-build Compile++ thumb : native_sample <= jni_part.cpp Prebuilt : libgnustl_static.a <= <ndk>/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/ SharedLibrary : libnative_sample.so /opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in ./obj/local/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ../../sdk/native/jni/../libs/armeabi-v7a/libopencv_java.so /opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/objs/native_sample/jni_part.o: in function cv::SURF::~SURF():../../sdk/native/jni/include/opencv2/nonfree/features2d.hpp:107: error: undefined reference to 'vtable for cv::SURF' /opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/objs/native_sample/jni_part.o: in function cv::SURF::~SURF():../../sdk/native/jni/include/opencv2/nonfree/features2d.hpp:107: error: undefined reference to 'VTT for cv::SURF' /opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/objs/native_sample/jni_part.o: in function Java_org_opencv_samples_tutorial3_Sample3Native_FindFeatures:jni/jni_part.cpp:26: error: undefined reference to 'cv::SURF::SURF(double, int, int, bool, bool)' /opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi-v7a/objs/native_sample/jni_part.o: in function Java_org_opencv_samples_tutorial3_Sample3Native_FindFeatures:jni/jni_part.cpp:34: error: undefined reference to 'cv::SURF::SURF()' collect2: ld returned 1 exit status make: * [obj/local/armeabi-v7a/libnative_sample.so] Error 1

here is the code

#include <jni.h>
#include <opencv2/core/core.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <vector>


using namespace cv;
using namespace std;

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3Native_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);

JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3Native_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
{

    Mat& img_object  = *(Mat*)addrGray;
    Mat& img_scene = *(Mat*)addrRgba;
    int minHessian = 400;

      SurfFeatureDetector detector( minHessian );

      vector<KeyPoint> keypoints_object, keypoints_scene;

      detector.detect( img_object, keypoints_object );
      detector.detect( img_scene, keypoints_scene );

      //-- Step 2: Calculate descriptors (feature vectors)
      SurfDescriptorExtractor extractor;

      Mat descriptors_object, descriptors_scene;

      extractor.compute( img_object, keypoints_object, descriptors_object );
      extractor.compute( img_scene, keypoints_scene, descriptors_scene );

      //-- Step 3: Matching descriptor vectors using FLANN matcher
      FlannBasedMatcher matcher;
      vector< DMatch > matches;
      matcher.match( descriptors_object, descriptors_scene, matches );

      double max_dist = 0; double min_dist = 100;

      //-- Quick calculation of max and min distances between keypoints
      for( int i = 0; i < descriptors_object.rows; i++ )
      { double dist = matches[i].distance;
        if( dist < min_dist ) min_dist = dist;
        if( dist > max_dist ) max_dist = dist;
      }



      //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
      vector< DMatch > good_matches;

      for( int i = 0; i < descriptors_object.rows; i ...
(more)
edit retag flag offensive close merge delete

Comments

Hi, I'm wondering did you find a solution for your problem. If yes, please let us know :)

JCrasher gravatar imageJCrasher ( 2015-02-15 06:28:21 -0500 )edit

2 answers

Sort by ยป oldest newest most voted
2

answered 2013-05-23 13:22:57 -0500

lanshan317 gravatar image

The reason you got that error is that for android OpenCV, nonfree module is not included. So, you need to build nonfree module by yourself.

There is an easy way to do that without rebuilding the whole OpenCV source code for android. you can refer to this tutorial: https://sites.google.com/site/wghsite/technical-notes/sift_surf_opencv_android

Hope this will help.

edit flag offensive delete link more
1

answered 2013-03-15 06:06:43 -0500

berak gravatar image

updated 2013-03-15 06:08:58 -0500

undefined reference, you're missing a library when linking

it can't find SURF (which is nonfree)

so besides opencv_features2d, for SIFT or SURF you need the opencv_nonfree library when linking

also, to set it up, you need some additional code:

#include "opencv2/nonfree/nonfree.hpp

and, in the first line of main:

cv::initModule_nonfree();

edit flag offensive delete link more

Comments

hi, same problem i incomment all the code and i just left SurfFeatureDetector detector(400); but same error error: undefined reference to 'cv::initModule_nonfree()

Marwen Z gravatar imageMarwen Z ( 2013-03-15 08:53:34 -0500 )edit

you've got to LINK the opencv_nonfree library as well ( if it's available for android at all, not so sure about that any more )

berak gravatar imageberak ( 2013-03-15 08:56:27 -0500 )edit

yes i added the #include "opencv2/nonfree/nonfree.hpp" but : error: undefined reference to 'cv::initModule_nonfree() where should I just put the folder nonfree !

Marwen Z gravatar imageMarwen Z ( 2013-03-15 09:05:04 -0500 )edit

that's ok, you need that for COMPILING, all well.

now next step is LINKING: search for the libraries(no idea how they're called for android). you already must have added opencv_features2d.a (.so?) now add opencv_nonfree.a (??) there

berak gravatar imageberak ( 2013-03-15 09:12:34 -0500 )edit

do you know where exactly we add library ! i added in /usr/include/lib Compile++ thumb : native_sample <= jni_part.cpp SharedLibrary : libnative_sample.so /opt/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol '__aeabi_atexit' in ./obj/local/armeabi-v7a/libgnustl_static.a(atexit_arm.o) is referenced by DSO ../../sdk/native/jni/../libs/armeabi-v7a/libopencv_java.so

Marwen Z gravatar imageMarwen Z ( 2013-03-15 10:53:39 -0500 )edit
1

oh, there's only one .so for the whole opencv stuff for android (libopencv_java.so) ? if that's the case (as it seems to be in the 'non-native' java one ), it seems, you can't use SIFT or SURF at all, unless you rebuild that libopencv_java.so.

berak gravatar imageberak ( 2013-03-15 11:17:14 -0500 )edit
Login/Signup to Answer

Question Tools

1 follower

Stats

Asked: 2013-03-15 05:07:37 -0500

Seen: 3,430 times

Last updated: May 23 '13