如何处理10位拜耳数据(字节数组)

2skhul33  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(366)

我有事耽搁了好几个小时,希望你能帮我。
我正在将相机集成到一个应用程序中,我想通过将值“bayer-mipi-10grbg”赋给“picture format”参数来利用可以检索的原始数据。在onpicturetaken回调中,我得到了一个字节数组(15482880字节)。
我还没有设法利用这个字节数组。
我读到为了获得一个可用的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是我从参数“raw size”得到的大小。很明显,我很难在这个大小和我接收的字节数组大小之间建立链接。我上载了一个包含我接收的字节数组的文件(保存为原样,不进行处理):https://ufile.io/gsis9

sqxo8psd

sqxo8psd1#

好吧,多亏了丹的宝贵帮助,我成功地从原始数据生成了一个图像。一段代码:

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);

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

相关问题