java - 如何处理 10 位拜耳数据(字节数组)
问题描述
我已经被困了几个小时,我希望你能帮助我。
我正在将相机集成到应用程序中,我想利用可以通过将值“ bayer-mipi-10grbg ”分配给“图片格式”参数来检索的 RAW 数据。使用我的 Redmi Note 6,在 OnPictureTaken 回调中,我得到一个字节数组(15,482,880 字节)。
我还没有设法利用这个字节数组。
我读到有必要对数据进行 debayer 以获得可用的 RGB 图像。所以我选择了 OpenCv 来让我的生活更轻松,请看以下代码:
public void OnPictureTaken(byte[] data, Camera camera)
{
var height = 4032;
var width = 3024;
var mBayer = new Mat(width, height, CvType.Cv16u);
var mRgb = new Mat();
mBayer.Put(0, 0, /* data' */);
Imgproc.CvtColor(mBayer, mRgb, Imgproc.COLORBayerGR2BGR);
Imgcodecs.Imwrite($"{_galleryFolder}/{DateTime.Now.ToString("yyMMddhhmmss")}", mRgb);
}
我的问题是,要构建一个 Cv16u 矩阵,我不能给它一个字节数组来吃,如果我理解正确它需要一个短裤数组。
我的问题是,我应该对我的字节数组应用什么转换以获得有效的短裤数组?
编辑: shorts 数组显然不是 bytes 数组的简单副本,例如,我想象前 x 个字节对应于 shorts 数组的第一个值(这是一个示例)。我不知道的正是这种转变。
Edit2: 4032x3024 是我从参数“原始大小”中获得的大小。我显然很难在这个大小和我收到的字节数组的大小之间建立联系。我上传了一个文件,其中包含我收到的字节数组(按原样保存,未经处理): https ://ufile.io/gsis9
解决方案
好的,多亏了 Dan 的宝贵帮助,我设法从我的原始数据中生成了一张图像。一段代码:
var size = width * height * 1.25f; // 10-bit depth
var pData = new List<short>();
for (int i = 0; i < size; i += 5)
{
pData.Add((short)(data[i] << 2 | ((data[i + 4] >> 0) & 3)));
pData.Add((short)(data[i + 1] << 2 | ((data[i + 4] >> 2) & 3)));
pData.Add((short)(data[i + 2] << 2 | ((data[i + 4] >> 4) & 3)));
pData.Add((short)(data[i + 3] << 2 | ((data[i + 4] >> 6) & 3)));
}
var mBayer = new Mat(width, height, CvType.Cv16u);
mBayer.Put(0, 0, pData.ToArray());
var mRgb = new Mat(width, height, CvType.Cv8u);
Imgproc.CvtColor(mBayer, mRgb, Imgproc.COLORBayerGR2RGB);
这给了我一个非常绿色的图像(我的下一个挑战是管理这个绿色光环)。
推荐阅读
- python - python中的加权最小绝对回归?
- vue.js - Feathers vuex:刷新后用户不再登录
- flutter - 使用应用图标打开应用时获取所有通知消息(如果有)
- laravel - Vuetify 中的未知自定义元素
- python - 散景:触发回调后,Hovertool 在旧实例上堆叠
- vba - 如何创建邮件项?
- javascript - 在服务器端代码命中之前获取 AjaxUpload 中的 onComplete
- r - 基于条件的R数据表分组并根据条件获取计数
- javascript - 如何使用 Javascript 读取具有自动生成的文档 ID 的 Firebase 文档
- vb.net - IsNumeric() 允许最后的值减去