我有一个用户拍照的应用程序,然后以Bitmap bitmap
的形式返回到java方法。我想将这个位图传递给C ++函数,以便在它被采取后立即进行一些OpenCV处理。
我无法找到正确的数据格式来将位图传递给方法。我已经尝试将位图作为jobect参数传递,但它没有工作。
这是我想要将位图传递到的jni方法:
JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_MainActivity_generateAssets(
JNIEnv *env, jobject thiz, jobject assetManager) {
答案 0 :(得分:2)
要从jni访问Bitmap
的像素缓冲区,您可以拨打getPixels:
NewByteArray
byte[]
对象(只需执行一次,GlobalRef /重用)GetByteArrayRegion
将java byte[]
映射到c缓冲区。您可以查看JNI函数here
或者,管理Java端的byte[]
像素缓冲区,并将byte[]
(和图像格式/维度)传递给jni而不是Bitmap
对象。例如:
JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_jniFacility_handleFrame(
JNIEnv *env, jobject self, jobject pixels, jint width, jint height, jint format) {
...
}
既然你说你得到Bitmap
,就把位图传递给jni:
pixels = new byte[width * height * 4]; // assume RGBA, do once only
...
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
handleFrame(pixels, bitmap.getWidth(), bitmap.getHeight());
为了获得最佳性能(和实时录制),您可能需要使用ImageReader
并使用YUV图像。
顺便说一下,如果你通过ImageReader获取帧,opencv会接受ImageFormat.YUV_420_888
。并且您可能想要调整大小并仅使用亮度通道进行大多数处理。