2013-04-09 8 views
8

Androidデバイス用のOpenCv4Androidを使用していくつかのアプリケーションを作成しようとしています。以前、私はAndroid NDKとC++ネイティブコードを使用していました。しかし、その技術はそれほど明快ではなかった。だから私はOpenCv 2.4.4のバージョンと一緒に来る最新のJava APIに切り替えました。OpenCv4AndroidとC++のデータタイプの混同

私は簡単なプログラムを書いてサンプルを実行することができました。しかし、私は、モデルPOSE推定、カメラ較正ルーチンなどのような高度な問題のためのいくつかのコードを書こうとしましたが、私はこの非常に奇妙な混乱に遭遇しました。名前がC++ APIで非常に直感的なデータ型の中には、Java対応のものと実際にはあまり合わないものもあります。したがって、私はC++からJavaに自分の機能を移植するのが難しいことに直面しています。私は、これらの関数(C++で)

  • Point2fで全くの混乱に直面しています - MatOfPoint2fを(++ Cで)
  • Point3f(Javaで) - MatOfPoint3f(Javaで)
  • ポイント2(Javaで)
  • Point3(Java版)

OpenCv Javaで使用されている用語とそれに類するものをC++で理解してください。

また、これらの用語の明確でわかりやすい説明が与えられています(私は提供されたヘルプを見てみましたが、それはC++とJava )。アンドレイPavlenko引用

+1

公式のOpenCvフォーラムで同じ質問をしました。それは次のように答えられました。リンクを参照してください - [OpenCv4AndroidとC++のデータ型の混同](http://answers.opencv.org/question/11021/confusion-between-opencv4android-and-c-data-types/) –

+2

今後の参考にお勧めしますあなたはリンクを使って回答を投稿し、それを受け入れます。このようにして、質問は未回答のリストから削除され、他の人が回答を見つけます。 – Mahm00d

答えて

5

MatOfXxxクラス(例えばMatOfPoint)はJavaとネイティブメモリとの間の中間データの冗長 コピーを回避するために導入しました。例えば。 は、1つのOpenCV関数 の結果として、いくつかの大きな点集合を得て、別のOpenCV関数に渡すことができます。

C++ではstd :: vector を使用しています。しかし、JavaでArrayListを使用すると、 は、 がこれらのポイントを返し、それらを使用して次の OpenCV関数を呼び出すときにそれらを戻すときに、ネイティブOpenCVレベルからJavaにすべてのポイントデータをJavaにコピーしました。効率を上げるために、 を、1n のMatの種類、または各要素にポイントを保持するn1次元(つまり、タイプ CV_32SC2またはCV_64FC2)のMatOfPointクラスに切り替えるようにしました。

ご存知のとおり、Matはすべてのデータを ネイティブレベルに保つため、データコピーを行わないOpenCVコール の間でこのようなオブジェクトを渡すことができます。しかし、あなたのJavaコードでは、ある時点で 実際のポイントデータに直接アクセスする必要がある場合はtoArray()およびfromArray メソッドからJavaとの間でデータを明示的に転送するメソッドがあります。必要 MatOfKeyPoint既存のものに対応する点を含むMatOfPoint2f 作成する例えば

、:[]のKeyPoint介しMatOfKeyPoint.toArray介してJavaへ

  • 負荷キーポイント()
  • 反復および対応するPoint [](cv :: Point、cv :: Point2f、cv :: Point2dはすべて org.opencv.core)を作成します。Javaでポイント)
  • ネイティブレベルのJavaタイプ対応対C++用として

にあなたのポイントを置く

  • 使用MatOfPoint2f.fromArray()またはc-TOR MatOfPoint2f(ポイント... PA):

  • vector<Point> : MatOfPoint 
    vector<Point2f> : MatOfPoint2f 
    vector<Point3i> : MatOfPoint3 
    vector<Point3f> : MatOfPoint3f 
    vector<KeyPoint> : MatOfKeyPoint 
    vector<DMatch> : MatOfDMatch 
    vector<Rect>  : MatOfRect 
    vector<uchar> : MatOfByte 
    vector<char>  : MatOfByte 
    vector<int>  : MatOfInt 
    vector<float> : MatOfFloat 
    vector<double> : MatOfDouble 
    vector<Vec4i> : MatOfInt4 
    vector<Vec4f> : MatOfFloat4 
    
    +0

    この回答をAndrey Pavlenkoさんは別のフォーラムから投稿しました。これはOpenCV Javaで始まった誰にとって、ここで答えがなかったかという重要な質問です。私がこれで評判を得られないように答えを "コミュニティwiki"に設定しました。 –

    関連する問題