C ++:如何解释图像的字节数组表示?

时间:2012-07-20 07:32:31

标签: c++ image camera

我正在尝试使用这款相机SDK,让我们说相机有这个名为CameraGetImageData(BYTE * data)的功能,我假设它接受一个字节数组,用图像数据修改它,然后返回一个基于成功/失败的状态代码。 SDK没有提供任何文档(甚至没有代码注释)所以我只是在这里猜测。这是我认为有用的代码片段

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位色捕获。

5 个答案:

答案 0 :(得分:1)

拍摄纯红色,纯绿色和纯蓝色的照片。看看会发生什么。

另外,如果你有记忆,我至少在最初的时候,我会把阵列变成1亿,而不是1000万。使用每像素24位的1000万像素摄像头将使用3000万字节,比您的阵列大。如果它像每个颜色存储1​​6位那样疯狂,则可能需要多达6000万或8000万字节。

你可以在传递之前用数据填充这个大数组。例如,重复填充'01234567'。然后很明显是什么字节已写入,哪些字节没有,所以你可以计算出返回的实际大小。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

甚至不知道相机的类型,这个问题几乎无法回答。 如果它是一台科学相机,它很可能会遵守IEEE 1394(又名IIDC或DCAM)标准。我亲自使用这个由滨松制作的相机使用此library与相机连接。

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

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

祝你好运!

答案 4 :(得分:-1)

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