Java 将位图从android摄像头传递到C++;与jni

Java 将位图从android摄像头传递到C++;与jni,java,android,c++,opencv,bitmap,Java,Android,C++,Opencv,Bitmap,我有一个用户在上面拍照的应用程序,它以位图的形式返回到java方法。我想把这个位图传递给C++函数,在它被占用后,就可以进行一些OpenCV处理。p> 我很难找到正确的数据格式来将位图传递到方法中。我尝试将位图作为jobect参数传递,但没有成功 下面是我要将位图传递到的jni方法: JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_MainActivity_generateAssets( JNIEnv

我有一个用户在上面拍照的应用程序,它以
位图的形式返回到java方法。我想把这个位图传递给C++函数,在它被占用后,就可以进行一些OpenCV处理。p>
我很难找到正确的数据格式来将位图传递到方法中。我尝试将位图作为jobect参数传递,但没有成功

下面是我要将位图传递到的jni方法:

JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_MainActivity_generateAssets(
    JNIEnv *env, jobject thiz, jobject assetManager) {

要从jni访问位图的像素缓冲区,可以调用:

  • NewByteArray
    一个
    byte[]
    对象(只需执行一次,全局引用/重用)
  • FindClass/GetMethodID/CallVoidMethod从c/c调用getPixels++
  • GetByteArrayRegion
    将java
    字节[]
    映射到c缓冲区
您可以检查JNI函数

或者,在Java端管理
字节[]
像素缓冲区,并将
字节[]
(以及图像格式/维度)传递给jni,而不是
位图
对象。例如:

JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_jniFacility_handleFrame(
    JNIEnv *env, jobject self, jobject pixels, jint width, jint height, jint format) {
    ...
}
既然您说您获得了
位图
,要将位图传递给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 image



顺便说一下,如果您通过ImageReader获取帧,则opencv接受
ImageFormat.YUV_420_888
。您可能希望调整大小,并仅使用亮度通道进行大多数处理。

要从jni访问
位图的像素缓冲区,您可以调用:

  • NewByteArray
    一个
    byte[]
    对象(只需执行一次,全局引用/重用)
  • FindClass/GetMethodID/CallVoidMethod从c/c调用getPixels++
  • GetByteArrayRegion
    将java
    字节[]
    映射到c缓冲区
您可以检查JNI函数

或者,在Java端管理
字节[]
像素缓冲区,并将
字节[]
(以及图像格式/维度)传递给jni,而不是
位图
对象。例如:

JNIEXPORT jintArray JNICALL Java_com_example_user_digitrecognition_jniFacility_handleFrame(
    JNIEnv *env, jobject self, jobject pixels, jint width, jint height, jint format) {
    ...
}
既然您说您获得了
位图
,要将位图传递给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 image



顺便说一下,如果您通过ImageReader获取帧,则opencv接受
ImageFormat.YUV_420_888
。您可能希望调整大小,并仅使用亮度通道进行大多数处理。

如何像您在最后一行中提到的那样将图像格式/尺寸传递给jni?我应该使用哪种格式?@Ber12345更新了您的查询答案,请注意,如果您获得的图像为
位图
,可能是出于意图,您无法控制该格式,需要使用图像实用程序函数手动转换。如何像您在最后一行中提到的那样将图像格式/维度传递给jni?我应该使用哪种格式?@Ber12345更新了您的查询答案,请注意,如果您获得的图像为
位图
,可能是出于意图,您无法控制格式,需要使用图像实用程序功能手动转换。