【问题标题】:C++: How to interpret a byte array representation of an image?C++:如何解释图像的字节数组表示?
【发布时间】:2012-07-20 07:32:31
【问题描述】:

我正在尝试使用这个相机 SDK,假设相机有一个名为 CameraGetImageData(BYTE* data) 的函数,我假设它接收一个字节数组,用图像数据修改它,然后返回一个基于成功/失败的状态码。 SDK 没有提供任何文档(甚至没有代码 cmets),所以我只是在这里猜测。这是我认为可行的代码sn-p

BYTE* data = new BYTE[10000000]; // an array of an arbitrary large size, I'm not 
                                 // sure what the exact size needs to be so I 
                                 // made it large
CameraGetImageData(data);
// Do stuff here to process/output image data

我已经在 Visual Studio 中运行了带有断点的代码,并且可以确认 CameraGetImageData 函数确实修改了数组。现在我的问题是,相机输出数据有标准方法吗?我应该如何开始使用这些数据以及每个字节代表什么?相机以 8 位颜色捕获。

【问题讨论】:

  • 通常是 RGB 三元组打包成行和列。
  • 我不认为相机输出数据的标准方式。也许你应该用这台相机拍一些特殊的照片(例如全黑、全白等),然后弄清楚输出数据中究竟提供了什么。
  • 如果没有文档,那么您将不得不对格式进行有根据的猜测,直到找到正确的格式。从 24 位交错 RGB 开始。
  • 相机只是转储原始 CCD 数据的可能性很大,在这种情况下,他们可能觉得不需要重复 CCD 规格。

标签: c++ image camera


【解决方案1】:

拍摄纯红色、纯绿色和纯蓝色。看看结果如何。

另外,如果你有内存的话,我会将数组设为 1 亿,而不是 1000 万,至少最初是这样。每像素使用 24 位的 10 兆像素相机将使用 3000 万字节,比您的阵列还大。如果它做一些疯狂的事情,比如为每种颜色存储 16 位,它可能会占用 6000 万或 8000 万字节。

您可以在传递数据之前用数据填充这个大数组。例如用重复的“01234567”填充它。然后很明显哪些字节已写入,哪些字节未写入,因此您可以计算出返回的实际大小。

【讨论】:

    【解决方案2】:

    我认为没有标准,但您可以尝试通过在相机前放置一些纯色图像来确定哪些值是什么。所以所有像素都将是大致相同的颜色。了解应该在每个像素中存储什么颜色后,您可能会了解颜色在数组中的表示方式。我会选择black, white, reg, green, blue 图片。

    但也可以考虑找一个更好的SDK,它有文档,因为只制作一个大数组是非常糟糕的设计

    【讨论】:

      【解决方案3】:

      您应该查看相机 SDK 上的文档,因为数据输出没有“标准”或“通用”方式。可以是raw 数据,可以是RGB 数据,甚至可以是已经压缩过的数据。如果相机供应商没有提供任何信息,您可以尝试查找一些处理最常见格式的库,并尝试传递您必须查看的数据以查看会发生什么。

      【讨论】:

        【解决方案4】:

        即使不知道相机的类型,这个问题几乎是不可能回答的。 如果它是一台科学相机,它很可能符合 IEEE 1394(又名 IIDC 或 DCAM)标准。我亲自使用过这种由滨松制造的相机,使用此library 与相机进行交互。

        在我的情况下,相机输出只是原始数据。相机本身是单色的,每个像素的深度分辨率为 12 位。因此,每个像素强度作为 16 位无符号值存储在结果数组中。数组的大小只是width * height * 2 字节,其中widthheight 是以像素为单位的图像尺寸,2 是每像素16 位的因子。 widthheight 从所选的相机模式中是先验已知的。

        如果您有结果图像的尺寸,请尝试将字节数组转储到文件中并在 Python 或 Matlab 中加载结果,然后尝试将内容可视化。另一种可能性是使用图像编辑器(例如ImageJ)加载此原始文件,并希望从中得到任何东西。

        祝你好运!

        【讨论】:

          【解决方案5】:

          我希望这个问题的解决方案对您有所帮助:https://stackoverflow.com/a/3340944/291372 实际上,您有一个像素数组(如果您的相机以 8 位捕获,则假设每个像素 1 个字节)。你需要什么 - 只是确定宽度和高度。之后,您可以尝试从字节数组中恢复位图图像。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-25
            • 2010-12-18
            • 2013-08-13
            • 2013-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多