java - 如何通过JNI操作CameraPreview bytearray? (开放式简历)

标签 java android c++ opencv java-native-interface

在我的“public void onPreviewFrame(byte[] data, Camera camera) { .... }”中 我想获取字节数组“数据”并将其传递给 JNI 并应用一些 OpenCV 过滤器,以便预览更改,但不返回。 执行此操作的最佳方法是什么?

目前我只传递这样的bytearray:

JNIEXPORT jint JNICALL Java_example_jnitest_Lib_filterfunc
      (JNIEnv * je, jclass jc, jbyteArray byteData){
    try {
         jbyte* _b_data= je->GetByteArrayElements(byteData, 0);
         int height = base;
         int width = base2;
         Mat mdata(height, width, CV_8UC4, (unsigned char *)_b_data);
         Mat myMat = imdecode(mdata,1);
         je->ReleaseByteArrayElements(byteData, _b_data, 0);
         return 1;
    } catch(const exception& ex){
        return 0;
    }
}

在 Java 代码中:

 public static native int filterfunc(byte[] byteData);

注意:目前返回值为 1,所以我希望将 bytearray 转换为 Mat Obejct 是可行的。但这不会更改预览,因为我不会将其改回字节数组。

最佳答案

I want to take the bytearray "data" and pass it to the JNI and apply some OpenCV filters so that the preview changes, without returning it.

不幸的是,这是不可能的。传递给 onPreviewFrame() 的字节数组只是预览帧的一个拷贝,您对其所做的任何更改都不会显示在预览中。您可以通过在 onPreviewFrame() 函数中修改 Java 中的字节数组作为测试来自行测试,您不会看到任何效果。

如果您想使用 OpenCV 更改预览帧数据并在预览窗口中查看结果,那么您需要将处理后的帧上传到 OpenGL 纹理,然后将其渲染到 GLSurfaceView。 , 使用 fragment 着色器转换 NV21 data到 RGB,或其他一些方法。简单地更改字节数组是行不通的。

有关更多信息,请参阅这些问题:

PreviewCallback onPreviewFrame does not change data

onPreviewFrame doesn't change the data

关于java - 如何通过JNI操作CameraPreview bytearray? (开放式简历),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30749232/

相关文章:

C++ 按值传递类

c++ - 当结构在 C++ 中为真或假时明确

Java Nashorn 不一致的绑定(bind)行为。这是一个错误吗?

java - 改进我的贪心算法

java - 使用 Google Guava 获取字符串的前导数字

android - 某些图像无法加载 - android openGL 纹理

c++ - 服务器端

java - 在java中保存随机数

android - 谷歌广告 ID 在 Nougat 上返回 Null

java - Android:从 Intent 中获取 App-Name