Я разрабатываю приложение для 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);
}
Как я могу это сделать?
С наилучшими пожеланиями.Клейсон Риос.