2015-02-13 2 views
1

Я хочу обнаружить ключевые точки изображения. Я попробовал следующий код с отличительными признаками функций из библиотеки OpenCV.SURF & SIFT признак функции OpenCV android

Он работает для ORB, BRISK, FAST и т. Д. Но не для SURF/SIFT и даже для детекторов MSER!

public class ReadImaageActivity extends ActionBarActivity { 

Mat image ; File fileimage ; 
TimePicker time ; 
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        Log.i("activity", "OpenCV loaded successfully"); 

        fileimage = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/7.jpg"); 

        if (fileimage.exists()) 

        image = Highgui.imread(fileimage.getAbsolutePath() ,Highgui.CV_LOAD_IMAGE_COLOR); 

        else Log.i("activity","dont exit")  ; 


       // 

        long startTime = System.nanoTime(); 

        FeatureDetector fd= FeatureDetector.create(FeatureDetector.SURF); 

        MatOfKeyPoint keypoints= new MatOfKeyPoint(); 
        try 
        { 

        fd.detect(image, keypoints); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

        long endTime = System.nanoTime(); 

        long duration = (endTime - startTime)/1000000; //divide by 1000000 to get milliseconds. 



        if (!keypoints.empty()) 
        { 

         Log.i("Keypoints", "is not empty"); 


         System.out.println("duration"+""+duration); 


         System.out.println("size"+""+keypoints.size()); 
       } 
        else 
          Log.i("Keypoints", "is not empty"); 
       /* 
        Mat descriptors=new Mat(); 
        DescriptorExtractor dex =DescriptorExtractor.create(DescriptorExtractor.SURF); 


        { 


        dex.compute(image, keypoints, descriptors); 

        long endTime = System.nanoTime(); 

        long duration = (endTime - startTime)/1000000; //divide by 1000000 to get milliseconds. 
        System.out.println(descriptors.size()); 
        System.out.println("duration"+duration); 
        } 
        else System.out.println("a3"); 

        */ 










       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 
@SuppressLint("NewApi") @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_read_imaage); 


} 

@Override 
public void onResume() 
{ 
    super.onResume(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback); 
} 

      } 

Это потому, что алгоритмы SURF и SIFT не поддерживаются?

ответ

2

Для версии C++, мы используем cv::initModule_nonfree()

Это происходит потому, что в новых версиях OpenCV, прибой/SIFT алгоритмы, к сожалению, в отдельной библиотеке, которую необходимо инициализировать до создания этих художественных детекторов.

Смежные вопросы