在普通C中创建个人图像格式

时间:2012-06-18 00:43:21

标签: c image webcam image-formats

我不是软件工程师。如果你发现这个问题很尴尬,请原谅。

我希望有一种图像格式应该是内存效率高,但很容易在纯C中操作。更具体地说,我希望将每个像素存储在一个数组中形式:

像素[行#] [列#] [颜色]

其中索引行#和列#(最大值为255)是坐标,索引颜色(最大值为2)包含由位置指定的像素的RGB值(像素[ 255] [255] [1]用于检查或操纵右下角像素内的绿色数量。)

我的目标是在机器人应用程序中使用此表单,通过使用“嵌套”从左上角开始扫描图像,可以轻松找到第一个红色/蓝色/绿色像素的坐标循环“(是的,不是创意解决方案)。在这里,您可能会说,如果图像上有白色区域,代码将返回错误的坐标。我知道这个事实,但图像不会有复杂的图案,并且(如果需要)我可以存储不相关的颜色,就像它们是黑色的一样。我也不关心亮度,伽马,alpha等等。

那么可以写一个C(或C ++,如果必须的话)代码从网络摄像头拍摄每0.5秒的快照,并将原始图像从网络摄像头转换为上面指定的格式吗?如果您说C无法直接到达相机,是否可以编写一个代码,该代码需要可以访问相机的软件,拍摄快照然后将原始数据存储在文件中?如果是,我如何使用C代码读取此原始数据文件,以便至少可以尝试转换?我在笔记本电脑上使用Windows Vista。

很抱歉保留这个问题很长,但我不想留下任何不清楚的地方。

2 个答案:

答案 0 :(得分:2)

是的,这样的文件格式是可能的。只有理智才能防止它被实施/使用。

相当广泛使用的某些格式几乎与您考虑的方式一样简单。例如,32位BMP在文件上有一个小标题,用于说明图片大小(x,y像素尺寸)之后的原始像素值,因此它基本上只是ColorColorColor ...对于图像中的像素数。

使用32位BMP执行扫描的代码将非常简单 - 打开文件的代码,为缓冲区分配空间以读取数据等等,可能很容易长于扫描码本身。

答案 1 :(得分:2)

采用“标准”图片格式也意味着您拥有生成测试数据并独立查看结果的工具

最简单的纯C代码(即使它不是很高效)是portable pixmap(ppm)。

这只是一个纯文本文件

P3 <cr>               # P3 means an ascii color file R,G,B
640 480 <cr>          # 640 pixels wide, 480 rows deep
255 <cr>              # maximum value is 255
# then just a row of RGB values separated by space with a CR 
255   0   0     0 255   0     0   0 255 #....... 640 triplets <cr> 
255 255   0   255 255 255     0   0   0  # ....... next row etc

还有一个更高效的二进制版本,其中数据是纯RGB字节,因此在单个操作中很容易读入C数组