2012-03-30 9 views
8

私はOpenCV Androidアプリを持っています。そのコードのほとんどはJavaで書かれていますが、私は の中にある1つの関数を持っています。 この関数はMatオブジェクトを取得し、新しいものを返します。OpenCVのネイティブコードからjavaにMatオブジェクトを返す

私の質問は、ネイティブコードからJavaにMatを返す方法です。 その例は見つかりませんでした。

ありがとうございました。

答えて

20

今日、私はネイティブコードからMatを返さなければなりませんでした。私は "Tutorial 2 Advanced - 2. Mix Java + Native OpenCV"から始めました。これは既に、カメラからキャプチャされた2つのMatオブジェクトをネイティブコードに渡します。 しかし、私は、抽出した特徴を返すように望んでいた、ので、私は署名にjlong addrDescriptorを追加しました:

extern "C" { 
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4View_FindFeatures(JNIEnv* env, jobject thiz, jlong addrGray, jlong addrRgba, jlong addrDescriptor) 
{ 
    Mat* pMatGr=(Mat*)addrGray; 
    Mat* pMatRgb=(Mat*)addrRgba; 
    Mat* pMatDesc=(Mat*)addrDescriptor; 
    vector<KeyPoint> v; 

    //OrbFeatureDetector detector(50); 
    OrbFeatureDetector detector; 
    OrbDescriptorExtractor extractor; 
    detector.detect(*pMatGr, v); 
    extractor.compute(*pMatGr, v, *pMatDesc); 
    circle(*pMatRgb, Point(100,100), 10, Scalar(5,128,255,255)); 
    for(size_t i = 0; i < v.size(); i++) { 
     circle(*pMatRgb, Point(v[i].pt.x, v[i].pt.y), 10, Scalar(255,128,0,255)); 
    } 
    } 
} 

をJavaの部分で、私はマット

private Mat descriptor; 
descriptor = new Mat(); 

トリックを行いgetNativeObjAddr()方法を追加しました。 MatはJavaで割り当てられ、そのアドレスはネイティブコードに渡されるため、明示的に返されることはありません。

FindFeatures(mGraySubmat.getNativeObjAddr(), mRgba.getNativeObjAddr(), descriptor.getNativeObjAddr()); 
Log.i("desc:" , descriptor.dump()); 

Matは必要なデータで満たされており、JNI呼び出しが返された後にJavaコードで直接アクセスできます。マットがリリースされたコードに他の

Somwhere:

if (descriptor != null) 
    descriptor.release(); 
descriptor = null; 
+0

こんにちはスタッカは、これに私のネイティブコードを変更:マット*画像=(マット*)addrDescriptor。 \tマット処理(* image.size()、CV_8UC3); \t cv :: medianBlur(* image、processing、5);今度は、次のエラーメッセージが表示されます:jni/objDetector.cpp:23:エラー: 'image'のメンバー 'size'に対する要求です。非クラス型です 'cv :: Mat * –

+0

@SaqibRazaq署名は 'void medianBlur(const Mat&src、Mat&dst、int ksize) '処理の参照で呼び出す必要があります。 '&processing'を試してください。 'Mat&processing(image.size()、CV_8UC3);' – stacker

+0

@SaqibRazaq 'Mat&dst'を返す場合は、Javaコードで宣言し、JNIメソッドの呼び出しに追加する必要があります。あなたが '画像 'を追加したのと同じように。 – stacker

関連する問題