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

标签 java c# android opencv image-processing

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

我正致力于将相机集成到应用程序中,我想利用可以通过分配值 'bayer-mipi-10grbg 来检索的 RAW 数据' 到 'picture-format' 参数。使用我的 Redmi Note 6,在 OnPictureTaken 回调中,我得到一个字节数组(15,482,880 字节)。

我还没有设法利用这个字节数组。

我读到有必要对数据进行去拜耳处理以获得可用的 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 数组。

我的问题是,我应该对字节数组应用什么转换以获得有效的 shorts 数组?

编辑: shorts 数组显然不是 bytes 数组的简单副本,我想例如前 x 个字节对应于 shorts 数组的第一个值(这是一个例子)。我不知道的就是这种转变。

编辑2: 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);

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

关于java - 如何处理10位拜耳数据(字节数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54514126/

相关文章:

java - guice 的 TypeLiteral 是如何工作的?

c# - 在执行过程中更改 web 服务地址

java - LayoutParams 上的 ClassCastException 从 LinearLayout 到 AbsListView

android - 在 OpenGL ES 中使用 png/jpg 的正确方法

javascript - 缩小包含服务器端标签的 javascript

Android AlarmManager 不准确

java - 这个程序发生了什么,更重要的是,为什么?

java - 加载 NER 分类器时出错 - ZLIB 输入流意外结束

java - java中不兼容的类型

c# - 以编程方式将项目添加到弹出窗口