5

OpenCV と JNI を使用して Android プロジェクトを開発しています。

実は顔検出サンプルを変更しています。

私が抱えている問題は、 cv::Mat 参照を渡すと、奇妙な出力が得られ、うまく渡されないことです。

あなたを状況に置くために、私は私のAndroidアプリの主な活動である私のFdActivity.javaにこれを持っています:

 public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
    rgb = inputFrame.rgba();
    Mat res = mNativeDetector.process(rgb);
    return res;
}

プロセス関数は次のようになります。

public Mat process(Mat rgb) {
    Mat n = null;
    if(rgb.empty()) {
        System.out.println("Empty Image");
    }
    else {
        System.out.println("The image is " + rgb.rows() + "x" + rgb.cols());
        n = nativeSkinFilter(mNativeObj, rgb.getNativeObjAddr());
    }   
    return n;
}

ここで、nativeSkinFilter は、この宣言を持つネイティブ関数です

private static native Mat nativeSkinFilter(long thiz, long inputImage);

C++ 側には、関数宣言 (DetectionBasedTracker.h) があります。

JNIEXPORT jlong JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeSkinFilter (JNIEnv *, jclass, jlong);

私がやりたいことは、C++ 関数を渡すだけで同じ画像を返すことだけです (行列を正しく渡すことができるとわかったらすぐに、より複雑な実装が行われます)、コードは次のようになります (DetectionBasedTracker.cpp) :

JNIEXPORT jlong JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeSkinFilter (JNIEnv * jenv,jclass,jlong rgb)
{
    Mat* rgba = (Mat*) rgb;
    if(rgb == 0) {
        LOGD("Null matrix");
    }
    else {
        LOGD("The matrix is not null. It has %i rows and %i columns", (*rgba).rows, (*rgba).cols);
    }

    return (jlong)rgb;
}

私が持っている出力は次のとおりです。

07-07 13:00:07.671: I/Choreographer(14980): Skipped 55 frames!  The application may be doing too much work on its main thread.
07-07 13:00:07.701: E/BufferQueue(14980): [unnamed-14980-0] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=6 undequeudCount=0)
07-07 13:00:07.741: I/JavaCameraView(14980): Preview Frame received. Need to create MAT and deliver it to clients
07-07 13:00:07.741: I/JavaCameraView(14980): Frame size  is 576000
07-07 13:00:07.761: I/System.out(14980): The image is 480x800
07-07 13:00:07.761: D/FaceDetection/DetectionBasedTracker(14980): The matrix is not null. It has 1937716000 rows and 0 columns
07-07 13:00:07.761: E/cv::error()(14980): OpenCV Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 97
07-07 13:00:07.761: E/org.opencv.android.Utils(14980): nMatToBitmap catched cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
07-07 13:00:07.761: A/libc(14980): Fatal signal 11 (SIGSEGV) at 0x0000000a (code=1), thread 15115 (Thread-5379)
07-07 13:00:07.791: E/BufferQueue(14980): [unnamed-14980-0] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=5 undequeudCount=1)
07-07 13:00:07.801: I/JavaCameraView(14980): Preview Frame received. Need to create MAT and deliver it to clients
07-07 13:00:07.801: I/JavaCameraView(14980): Frame size  is 576000

私はすべてを試したと思いますが、正しい方法のようで、まだ失敗しています。助けてください。

お時間をいただきありがとうございました!助けていただければ幸いです。

4

1 に答える 1