10

私は OpenCV Android アプリを持っています。そのコードのほとんどは Java ですが、C の関数が 1 つあります。関数は Mat オブジェクトを取得し、新しいオブジェクトを返します。

私の質問は、ネイティブ コードから Java に Mat を返すにはどうすればよいですか? その例は見つかりませんでした。

ありがとう。

4

2 に答える 2

27

今日、ネイティブ コードから Mat を返さなければなりませんでした。「チュートリアル 2 アドバンスト - 2. Java + ネイティブ OpenCV の混合」から始めましたが、既に 2 つのマット (カメラからキャプチャされた画像) オブジェクトがネイティブ コードに渡されています。しかし、抽出された機能を返したかったので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 コードで直接アクセスできます。

コードのどこかでマットが解放されます。

if ( descriptor != null) 
  descriptor.release();
descriptor = null;
于 2012-04-07T09:06:18.663 に答える