2012-03-23 23 views
2

SIFT、SURF、BRIEFおよびORBが何をするかを示す簡単なアプリケーション(sample2の変更)を実装したいと思います。ユーザは回転またはスケールの不変性または速度を単純に比較することができる。しかし、私は私があなたの助けに向けるために扱うことができない失敗を見つけました。 SIFTまたはSURFを使用しようとすると、一致するように試みると常に例外が発生します。matcherBruteForce.match(descriptorFrame, matches);パターン認識アルゴリズムの例外を取得するOpenCVでのANDROIDのためのSIFT、

私は同様のARアプリケーションを使用しています。これらの設定では動作していますので、間違っています。私は変数 "matcherBruteForce"をBRUTEFORCE、BRUTEFORCE_L1、BRUTEFORCE_SL2イベントをBRUTEFORCE_HAMMINGに設定しようとしました。しかし、私はいつも同じ例外を得た:

SIFT:

CvException [org.opencv.core.CvException: /home/andreyk/OpenCV2/trunk/opencv_2.3.1.b2/modules/features2d/include/opencv2/features2d/features2d.hpp:2455: error: (-215) DataType<ValueType>::type == matcher.trainDescCollection[iIdx].type() || matcher.trainDescCollection[iIdx].empty() in function static void cv::BruteForceMatcher<Distance>::commonKnnMatchImpl(cv::BruteForceMatcher<Distance>&, const cv::Mat&, std::vector<std::vector<cv::DMatch> >&, int, const std::vector<cv::Mat>&, bool) [with Distance = cv::SL2<float>] 
] 

SURF:

任意のヘルプは

を高く評価し
CvException [org.opencv.core.CvException: /home/andreyk/OpenCV2/trunk/opencv_2.3.1.b2/modules/features2d/include/opencv2/features2d/features2d.hpp:2455: error: (-215) DataType<ValueType>::type == matcher.trainDescCollection[iIdx].type() || matcher.trainDescCollection[iIdx].empty() in function static void cv::BruteForceMatcher<Distance>::commonKnnMatchImpl(cv::BruteForceMatcher<Distance>&, const cv::Mat&, std::vector<std::vector<cv::DMatch> >&, int, const std::vector<cv::Mat>&, bool) [with Distance = cv::SL2<float>] 
] 

クラス全体:あなたは

package sk.bolyos.opencv; 

import java.util.Vector; 

import org.opencv.features2d.DMatch; 
import org.opencv.features2d.DescriptorExtractor; 
import org.opencv.features2d.DescriptorMatcher; 
import org.opencv.features2d.FeatureDetector; 
import org.opencv.features2d.Features2d; 
import org.opencv.features2d.KeyPoint; 
import org.opencv.highgui.VideoCapture; 
import org.opencv.android.Utils; 
import org.opencv.core.Mat; 
import org.opencv.core.Size; 
import org.opencv.imgproc.Imgproc; 
import org.opencv.highgui.Highgui; 

import sk.bolyos.svk.*; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.util.Log; 
import android.view.SurfaceHolder; 




public class MyView extends CvViewBase { 

    private static final int BOUNDARY = 35; 

    private Mat mRgba; 
    private Mat mGray; 
    private Mat mIntermediateMat; 
    private Mat mLogoMilka1,mLogoMilka2,mLogoMilka3,mLogoMilka4; 
    ///////////////////DETECTORS 
    FeatureDetector siftDetector = FeatureDetector.create(FeatureDetector.SIFT); 
    FeatureDetector surfDetector = FeatureDetector.create(FeatureDetector.SURF); 
    FeatureDetector fastDetector = FeatureDetector.create(FeatureDetector.FAST); 
    FeatureDetector orbDetector = FeatureDetector.create(FeatureDetector.ORB); 
    ///////////////////DESCRIPTORS 
    DescriptorExtractor siftDescriptor = DescriptorExtractor.create(DescriptorExtractor.SIFT); 
    DescriptorExtractor surfDescriptor = DescriptorExtractor.create(DescriptorExtractor.SURF); 
    DescriptorExtractor briefDescriptor = DescriptorExtractor.create(DescriptorExtractor.BRIEF); 
    DescriptorExtractor orbDescriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); 
    ///////////////////DATABASE 
    Vector<KeyPoint> vectorMilka1 = new Vector<KeyPoint>(); 
    Vector<KeyPoint> vectorMilka2 = new Vector<KeyPoint>(); 
    Vector<KeyPoint> vectorMilka3 = new Vector<KeyPoint>(); 
    Vector<KeyPoint> vectorMilka4 = new Vector<KeyPoint>(); 
    Mat descriptorMilka1 = new Mat(); 
    Mat descriptorMilka2 = new Mat(); 
    Mat descriptorMilka3 = new Mat(); 
    Mat descriptorMilka4 = new Mat(); 
    ///////////////////VIDEO 
    Vector<KeyPoint> vectorFrame = new Vector<KeyPoint>(); 
    Mat descriptorFrame = new Mat(); 

    DescriptorMatcher matcherHamming = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); 
    DescriptorMatcher matcherBruteForce = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2); 
    Vector<DMatch> matches = new Vector<DMatch>(); 
    Vector<Mat> siftDescriptors = new Vector<Mat>(); 
    Vector<Mat> surfDescriptors = new Vector<Mat>(); 
    Vector<Mat> briefDescriptors = new Vector<Mat>(); 
    Vector<Mat> orbDescriptors = new Vector<Mat>(); 

    public MyView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
     try{ 
      /* 
      if (mLogoMilka1 == null){ 
       mLogoMilka1 = new Mat(); 
       mLogoMilka1 = Utils.loadResource(getContext(), R.drawable.milkalogo); 
       fillDB(mLogoMilka1,vectorMilka1,descriptorMilka1); 
      } 
      if (mLogoMilka2 == null){ 
       mLogoMilka2 = new Mat(); 
       mLogoMilka2 = Utils.loadResource(getContext(), R.drawable.milkalogom); 
       fillDB(mLogoMilka2,vectorMilka2,descriptorMilka2); 
      } 
      if (mLogoMilka3 == null){ 
       mLogoMilka3 = new Mat(); 
       mLogoMilka3 = Utils.loadResource(getContext(), R.drawable.milkalogol); 
       fillDB(mLogoMilka3,vectorMilka3,descriptorMilka3); 
      }*/ 
      if (mLogoMilka4 == null){ 
       mLogoMilka4 = new Mat(); 
       mLogoMilka4 = Utils.loadResource(getContext(), R.drawable.milkalogolc); 
       fillDB(mLogoMilka4,vectorMilka4,descriptorMilka4); 
      } 

     }catch(Exception e){ 
      Log.e("SVK APPLICATION", "in MyView constructor "+e.toString()); 
     } 
    } 

    public void fillDB(Mat mLogo,Vector<KeyPoint> vector,Mat descriptor){ 

     //SIFT 
     siftDetector.detect(mLogo, vector); 
     siftDescriptor.compute(mLogo, vector, descriptor); 
     siftDescriptors.add(descriptor); 
     //SURF 
     surfDetector.detect(mLogo, vector); 
     surfDescriptor.compute(mLogo, vector, descriptor); 
     surfDescriptors.add(descriptor); 
     //FAST+BRIEF 
     fastDetector.detect(mLogo, vector); 
     briefDescriptor.compute(mLogo, vector, descriptor); 
     briefDescriptors.add(descriptor); 
     //ORB 
     orbDetector.detect(mLogo, vector); 
     orbDescriptor.compute(mLogo, vector, descriptor); 
     orbDescriptors.add(descriptor); 

    } 


    @Override 
    public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { 
     super.surfaceChanged(_holder, format, width, height); 

     synchronized (this) { 
      // initialize Mats before usage 
      mGray = new Mat(); 
      mRgba = new Mat(); 
      mIntermediateMat = new Mat(); 
      matches = new Vector<DMatch>(); 
      vectorFrame = new Vector<KeyPoint>(); 
      descriptorFrame = new Mat(); 
     } 
    } 

    @Override 
    protected Bitmap processFrame(VideoCapture capture) { 
     // TODO Auto-generated method stub 
     switch (SVKApplikaciaActivity.viewMode) { 
     case SVKApplikaciaActivity.VIEW_MODE_SIFT: 
      //TODO SIFT 
      try{ 
       //matcherBruteForce = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); 
       //matcherBruteForce.clear(); 
       matcherBruteForce.add(siftDescriptors); 
       matcherBruteForce.train();// proba 

       capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 
       Imgproc.resize(mGray, mGray,new Size(480,320)); 
       siftDetector.detect(mGray, vectorFrame); 
       siftDescriptor.compute(mGray, vectorFrame, descriptorFrame); 

       matcherBruteForce.match(descriptorFrame, matches); 
       Vector<DMatch> matchesXXX = new Vector<DMatch>(); 
       for (DMatch t : matches) 
        if(t.distance<BOUNDARY) 
         matchesXXX.add(t); 
       Mat nGray = new Mat(); 
       Mat nLogo = new Mat(); 
       Mat nRgba = new Mat(); 
       Imgproc.cvtColor(mGray, nGray, Imgproc.COLOR_RGBA2RGB, 3); 
       Imgproc.cvtColor(mLogoMilka4, nLogo, Imgproc.COLOR_RGBA2BGR, 3); 
       Features2d.drawMatches(nGray, vectorFrame, nLogo, vectorMilka4, matchesXXX, nRgba); 
       Imgproc.cvtColor(nRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 4); 
      }catch(Exception e){ 
       Log.e("SVK APPLICATION","in SIFT "+ e.toString()); 
      } 
      break; 
     case SVKApplikaciaActivity.VIEW_MODE_SURF: 
      //TODO SURF 
      try{ 
       //matcherBruteForce = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); 
       //matcherBruteForce.clear(); 
       matcherBruteForce.add(surfDescriptors); 
       matcherBruteForce.train();// proba 

       capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 
       Imgproc.resize(mGray, mGray,new Size(480,320)); 
       surfDetector.detect(mGray, vectorFrame); 
       surfDescriptor.compute(mGray, vectorFrame, descriptorFrame); 

       matcherBruteForce.match(descriptorFrame, matches); 
       Vector<DMatch> matchesXXX = new Vector<DMatch>(); 
       for (DMatch t : matches) 
        if(t.distance<BOUNDARY) 
         matchesXXX.add(t); 
       Mat nGray = new Mat(); 
       Mat nLogo = new Mat(); 
       Mat nRgba = new Mat(); 
       Imgproc.cvtColor(mGray, nGray, Imgproc.COLOR_RGBA2RGB, 3); 
       Imgproc.cvtColor(mLogoMilka4, nLogo, Imgproc.COLOR_RGBA2BGR, 3); 
       Features2d.drawMatches(nGray, vectorFrame, nLogo, vectorMilka4, matchesXXX, nRgba); 
       Imgproc.cvtColor(nRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 4); 
      }catch(Exception e){ 
       Log.e("SVK APPLICATION","in Surf "+ e.toString()); 
      } 
      break; 
     case SVKApplikaciaActivity.VIEW_MODE_BRIEF: 
      //TODO BRIEF 
      try{ 
       matcherHamming = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); 
       matcherHamming.add(briefDescriptors); 
       matcherHamming.train();// proba 

       capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 
       Imgproc.resize(mGray, mGray,new Size(480,320)); 
       fastDetector.detect(mGray, vectorFrame); 
       briefDescriptor.compute(mGray, vectorFrame, descriptorFrame); 

       matcherHamming.match(descriptorFrame, matches); 
       Vector<DMatch> matchesXXX = new Vector<DMatch>(); 
       for (DMatch t : matches) 
        if(t.distance<BOUNDARY) 
         matchesXXX.add(t); 
       Mat nGray = new Mat(); 
       Mat nLogo = new Mat(); 
       Mat nRgba = new Mat(); 
       Imgproc.cvtColor(mGray, nGray, Imgproc.COLOR_RGBA2RGB, 3); 
       Imgproc.cvtColor(mLogoMilka4, nLogo, Imgproc.COLOR_RGBA2BGR, 3); 
       Features2d.drawMatches(nGray, vectorFrame, nLogo, vectorMilka4, matchesXXX, nRgba); 
       Imgproc.cvtColor(nRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 4); 
      }catch(Exception e){ 
       Log.e("SVK APPLICATION","in Brief "+ e.toString()); 
      } 
      break; 
     case SVKApplikaciaActivity.VIEW_MODE_ORB: 
      //TODO ORB 
      try{ 
       matcherHamming = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); 
       matcherHamming.add(orbDescriptors); 
       matcherHamming.train();// proba 

       capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); 
       Imgproc.resize(mGray, mGray,new Size(480,320)); 
       orbDetector.detect(mGray, vectorFrame); 
       orbDescriptor.compute(mGray, vectorFrame, descriptorFrame); 

       matcherHamming.match(descriptorFrame, matches); 
       Vector<DMatch> matchesXXX = new Vector<DMatch>(); 
       for (DMatch t : matches) 
        if(t.distance<BOUNDARY) 
         matchesXXX.add(t); 
       Mat nGray = new Mat(); 
       Mat nLogo = new Mat(); 
       Mat nRgba = new Mat(); 
       Imgproc.cvtColor(mGray, nGray, Imgproc.COLOR_RGBA2RGB, 3); 
       Imgproc.cvtColor(mLogoMilka4, nLogo, Imgproc.COLOR_RGBA2BGR, 3); 
       Features2d.drawMatches(nGray, vectorFrame, nLogo, vectorMilka4, matchesXXX, nRgba); 
       Imgproc.cvtColor(nRgba, mRgba, Imgproc.COLOR_RGB2RGBA, 4); 
       }catch(Exception e){ 
        Log.e("SVK APPLICATION","in ORB "+ e.toString()); 
       } 
      break; 
     case SVKApplikaciaActivity.VIEW_MODE_AR: 
      //TODO AR 
      break;  

     } 

     Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888); 

     if (Utils.matToBitmap(mRgba, bmp)) 
      return bmp; 

     bmp.recycle(); 

     return null; 
    } 

    @Override 
    public void run() { 
     super.run(); 

     synchronized (this) { 
      // Explicitly deallocate Mats 
      if (mRgba != null) 
       mRgba.release(); 
      if (mGray != null) 
       mGray.release(); 
      if (mIntermediateMat != null) 
       mIntermediateMat.release(); 

      mRgba = null; 
      mGray = null; 
      mIntermediateMat = null; 
     } 
    } 

} 

答えて

3

Log.e("SVK APPLICATION","vectorFrame size = "+ vectorFrame.size());を入れて右

されていない場合、私は同じ問題を抱えていたと思います は..私はそれがゼロvectorFrameを返すと思います私は問題を知っていると思う。使用しているマッチャーは、SIFTおよびSURF記述子には適用できません。あなたはSIFTやサーフィンでDescriptorMatcherを使用する必要がある場合、あなたはそれをハミングに設定DescriptorMatcherを通過した場合には、エラーが返されます、SURFので、このような

DescriptorMatcher matcherBruteForce=DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2); 

として設定し、FloatBasedが独占的にディスクリプタ受け入れるSIFTなければなりません。

コードには2つのDescriptorMatchersがあり、1つはBRUTEFORCE.SL2に、もう1つはHAMMINGに設定されています。正しいもの、つまりBRUTEFORCE.SL2をSIFTまたはSURFに渡してください。

ここで彼らはORBと比較して、キーポイントの高い番号を抽出し、FLANNがキーポイントの大規模なセットに適していますので、それについての詳細を読む、SIFTやSURFためFLANNベースマッチャを使用するために、そのしかし最高

http://computer-vision-talks.com/2011/07/comparison-of-the-opencvs-feature-detection-algorithms-ii/

ここでhttp://opencv.willowgarage.com/documentation/cpp/flann_fast_approximate_nearest_neighbor_search.html

更新: uchar記述子の一致にはL2またはL1距離を使用できます。あなたがBRUTEFORCEに設定されたDescriptorMatcherを渡した場合、ORBのためにも動作する可能性があります(結果は悪くても)

+0

私はその理由を解決しました。なぜなら、私はサーフオーブの短い記述子を別々に選んだわけではないからです。しかし、ありがとう – Csabi

+0

ええ、私もそれを実現しました。しかし、あなたは別々の/ orb記述子(コード例)を設定していないということはどういう意味ですか、どのような変更を加えましたか? –

+0

私はfillDB関数を使用せず、すべてのORB/BRIEF/SURF/SIFTに個別の記述子を使用します – Csabi

1

ですあなたのサイズvectorFrameはゼロに等しくありませんか?あなたの問題は、検出そのアルゴリズムになり、あなたのイメージのカラーコードは、ちょうど私がどこか

関連する問題