android - 如何使用 JNI+OpenCV+NDK 获取原始的 android 相机传感器图像数据?

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

我正在为基于 Camera2Raw 的应用程序使用 camera2 api .

mRawImageReader = ImageReader.newInstance(largestRaw.getWidth(), 
       largestRaw.getHeight(),ImageFormat.RAW_SENSOR, /*maxImages*/

我有来自 ImageReader.OnImageAvailableListenerimage,我没有保存 DNG 文件,而是将其字节数组传递给我的 native opencv 函数进行处理:

int w = image.getWidth();
int h = image.getHeight();
ByteBuffer buffer = planes[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
addShot(w, h, data);
image.close();

和C++函数:

JNIEXPORT jboolean JNICALL addShot(JNIEnv* env, jobject obj, jint width, jint height, jbyteArray p_data)
   {
       jbyte* _p_data= env->GetByteArrayElements(p_data, 0);
       Mat srcBGR(height, width, CV_8UC3);
       Mat mdata(height, width, CV_8UC3, (unsigned char *)_p_data);
//        Mat tmp_mat= imdecode(mdata,1);
       cvtColor(mdata, srcBGR, CV_RGB2BGR);
       env->ReleaseByteArrayElements(p_data, _p_data, 0);
   }

首先。为了确保,我正在尝试在 C++ 端保存为 JPEG。但是结果有很多绿色。

我认为我的 C++ 代码中缺少部分。

有人可以帮忙吗?

最佳答案

处理 Bayer RAW 数据并非易事 - 它是传感器像素值的原始读数,您需要大量额外的元数据和处理才能将其转换为可 View 像。如果您不知道该怎么做,我不建议您尝试 - 您可以插入像 Adobe's DNG SDK 这样的库。 , 或 libraw .

你确定你不想要 YUV_420_888 数据,它是经过处理但未压缩的吗?

关于android - 如何使用 JNI+OpenCV+NDK 获取原始的 android 相机传感器图像数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201434/

相关文章:

android - 如何判断我的未绑定(bind)服务是否正在运行?

android - Android Webview中的多个文件上传

java - 这段代码 fragment 是什么意思

c++ - 我们可以在不混合的情况下拼接图像吗

python - 剪辑限制在 OpenCV CLAHE 中究竟意味着什么?

java - 通过 RTMP 从 Java OpenCV 流式传输

android - Gradle 找不到 Android Compose 编译器

c++ - 我无法在 Code::Blocks 中调试

c++ - 为什么在传递给 printf 时必须将字符串转换为 c_str(c 字符串)?

java - Canny 之后的对象提取