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

C++ C++;:如何解释图像的字节数组表示?,c++,image,camera,C++,Image,Camera,我正在尝试使用这个camera SDK,假设camera有一个名为CameraGetImageData(BYTE*data)的函数,我假设它接受一个字节数组,用图像数据修改它,然后根据成功/失败返回一个状态代码。SDK不提供任何文档(甚至不提供代码注释),所以我在这里只是客串。下面是一段我认为有效的代码片段 BYTE* data = new BYTE[10000000]; // an array of an arbitrary large size, I'm not

我正在尝试使用这个camera SDK,假设camera有一个名为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

我已经在VisualStudio中运行了带断点的代码,并且可以确认CameraGetImageData函数确实修改了数组。现在我的问题是,有没有一种标准的方式让摄像机输出数据?我应该如何开始使用这些数据,每个字节代表什么?相机以8位彩色拍摄。

我认为没有标准,但您可以尝试通过在相机前面放置一些纯色图像来确定哪些值是什么。因此,所有像素的颜色大致相同。了解每个像素中应存储的颜色后,您可能会了解颜色在阵列中的表示方式。我会选择黑色、白色、红色、绿色、蓝色的
图像


还要考虑找到一个更好的<代码> SDK,它有文档,因为只做一个大数组是很坏的设计,

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

我希望这个问题的解决方案能帮助您:
实际上,你有一个像素数组(如果你用8位相机捕捉,假设每像素1字节)。你需要的只是确定宽度和高度。之后,您可以尝试从字节数组恢复位图图像。

甚至不知道摄像头的类型,这个问题几乎不可能回答。 如果它是一个科学相机,它很可能符合IEEE 1394(又称IIDC或DCAM)标准。我个人使用过滨松制造的这种相机,用它来连接相机

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

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


祝你好运

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

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


您可以在传递数据之前用数据填充这个大数组。例如,重复填写“01234567”。然后很明显哪些字节被写入了,哪些字节没有写入,这样你就可以计算出返回的字节的实际大小。

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