Android OpenCV использует адрес памяти вместо GetByteArrayElements - PullRequest
0 голосов
/ 28 апреля 2019

Я разрабатываю приложение для Android для использования OpenCV.В новейших примерах 4.x OpenCV для Android нативная функция c ++ получает адрес памяти Mat от Java.

Проблема в том, что в моем случае у меня есть только кадр в байте [], и я преобразую его всторона Java от frame byte [] до Mat, значительно увеличивает время процесса.

Затем я хотел бы передать байту [], получить его адрес памяти и преобразовать в Mat на стороне c ++.

Это то, что у меня есть сегодня:

            public void process(Frame frame) {

                byte[] data = frame.getData();
                int rotation = frame.getRotation();
                long time = frame.getTime();
                Size size = frame.getSize();
                int format = frame.getFormat();

                int[] bgra = mBGRA;

                ProcessFrameGBA(size.getWidth(), size.getHeight(), data, bgra);

C ++

JNIEXPORT void JNICALL Java_com_smartnsens_opencvapp_MainActivity_ProcessFrame(
        JNIEnv *env,
        jobject /* this */,
        jint width,
        jint height,
        jbyteArray yuv /* raw data */,
        jintArray bgra /* return frame*/) {

    // Get native access to the given Java arrays.
    jbyte *_yuv = env->GetByteArrayElements(yuv, 0);
    jint *_bgra = env->GetIntArrayElements(bgra, 0);

    // Prepare a cv::Mat that points to the YUV420sp data.
    Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv); // Wrapper around the _yuv data.

    // Prepare a cv::Mat that points to the BGRA output data.
    Mat mbgra(height, width, CV_8UC4, (uchar *) _bgra);

    // Convert the color format from the camera's
    // NV21 "YUV420sp" format to an Android BGRA color image.
    cvtColor(myuv, mbgra, CV_YUV420sp2BGRA);

    // Release the native lock we placed on the Java arrays.
    env->ReleaseIntArrayElements(bgra, _bgra, 0);
    env->ReleaseByteArrayElements(yuv, _yuv, 0);
}

И мне бы хотелось что-то вроде этого:

JNIEXPORT void JNICALL Java_com_smartnsens_opencvapp_MainActivity_ProcessFrame(
        JNIEnv *env,
        jobject /* this */,
        jint width,
        jint height,
        jlong yuvAddr /* raw data */,
        jlong bgraAddr /* return frame*/) {

    // (Pseudo code below - I'm not sure if it's correct)
    jbyte *_yuv = *yuv;
    jint *_bgra = *bgra;

    // 
    // and change the code below to have the final frame in the mbgra
    //

    // Prepare a cv::Mat that points to the YUV420sp data.
    Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv); // Wrapper around the _yuv data.

    // Prepare a cv::Mat that points to the BGRA output data.
    Mat mbgra(height, width, CV_8UC4, (uchar *) _bgra);

    // Convert the color format from the camera's
    // NV21 "YUV420sp" format to an Android BGRA color image.
    cvtColor(myuv, mbgra, CV_YUV420sp2BGRA);

}

Как я могу это сделать?

С наилучшими пожеланиями.Клейсон Риос.

...