gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:58 24 4
gpt4 key购买 nike

在我的“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com