【问题标题】:How to process 10-bit bayer data (bytes array)如何处理 10 位拜耳数据(字节数组)
【发布时间】:2019-06-28 01:47:30
【问题描述】:

我在某件事上被困了好几个小时,希望你能帮助我。

我正在将相机集成到应用程序中,我想利用可以通过分配值“bayer-mipi-10grbg来检索的 RAW 数据>' 到 'picture-format' 参数。使用我的 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 数组的第一个值(这是一个示例)。我不知道的正是这种转变。

编辑2: 4032x3024 是我从参数“原始大小”中得到的大小。我显然很难在这个大小和我收到的字节数组的大小之间建立联系。 我上传了一个文件,其中包含我收到的字节数组(按原样保存,未经处理): https://ufile.io/gsis9

【问题讨论】:

  • stackoverflow.com/questions/11112216/… 只需将int 替换为short
  • @x39 没那么简单。我更新了我的问题。 (顺便说一句,这里没有int的问题)。
  • 它看起来像是打包好的(5 个字节代表 4 个像素),但它与您提供的尺寸不完全相加...可能是 4096x3024,因为这样总尺寸匹配(4096x3024x1.25 = 15,482,880)。您能否上传一个我们可以使用的示例文件?甚至可能是更低的分辨率...
  • @DanMašek 谢谢!我已经上传了一个包含字节数组的文件,因为我收到了它。我编辑了我的帖子。
  • @DanMašek 是的,就是这样(白平衡除外)干得好!感谢您的宝贵帮助。我手头没有项目(必须等到明天上班),但我等不及要测试它了。

标签: java c# android opencv image-processing


【解决方案1】:

好的,多亏了 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);

这给了我一个非常绿色的图像(我的下一个挑战是管理这个绿色光环)。

【讨论】:

  • Bayer 使用的模式可能在颜色组件的位置上有所不同。我wrote some c# code on a previous question here 对其进行解码。如果您只是将输入从Byte[] 更改为Int16[],它可能是有用的...尽管最终值当然必须从 10 位减少到 8 位。您说该格式将自己标识为“grbg”;这很可能是“绿红|蓝绿”的正方形。这个顺序很重要。
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 2017-10-26
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-09-03
  • 2021-12-26
相关资源
最近更新 更多