【发布时间】:2017-02-13 10:08:26
【问题描述】:
我正在为基于Camera2Raw 的应用程序使用camera2 api。
mRawImageReader = ImageReader.newInstance(largestRaw.getWidth(),
largestRaw.getHeight(),ImageFormat.RAW_SENSOR, /*maxImages*/
我有来自ImageReader.OnImageAvailableListener 的image,我没有保存 DNG 文件,而是将其字节数组传递给我的本机 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++ 代码中缺少部分。
有人可以帮忙吗?
【问题讨论】:
-
Docs: "一般原始相机传感器图像格式,通常表示单通道拜耳马赛克图像。每个像素颜色样本以 16 位精度存储。" ——你的情况不是这样吗?因为您似乎将其视为具有 8 位精度的 3 通道 RGB 图像。这似乎很奇怪。
-
是的,没错。我认为我的 c++ 代码可能适用于另一种情况,例如 YUV 格式。我发布的代码是我的试用版,图像处理不是我的领域:(所以我正在寻求帮助。如果有人指导我,我将不胜感激
-
android-24 添加了 NdkCamera,你也许可以直接从那里获取相机图像。头文件在 NDK 的平台下 include/camera, include/media (for AImagerReader)。
标签: android c++ opencv android-ndk java-native-interface