用于多个图像的内存缓冲区

我从两台摄像机在PC上接收图像。 流不是连续的,而是在事件检测时发生。 因此,在特定时间之后,我必须接收大约8-10个图像对。 由于我必须处理图像,我想首先将所有图像保存在一个大缓冲区中,然后再批量处理它们。 将图像保存在两个大缓冲区(每个摄像机一个)中也是可以接受的。 如何将这对图像保存在一个(或两个)大缓冲区中? 我在C中实现这个程序。

假设以下API来获取图像:

int ImageGet( char * pBuffer, size_t * pSize); /* returns 0 on success or any other value if no image is available or on error */ 

你可以做以下事情:

 #include  #include  ... #define IMAGESIZE_MAX (1024*1024) char * pBuffer = NULL; char * pBufferCurrent = pBuffer; int iResult = 0; size_t size = IMAGESIZE_MAX; size_t sizeTotal = 0; do { char * pBufferCurrent = realloc ( pBuffer, sizeTotal + sizeof(size) + size); if (!pBufferCurrent) { break; } pBuffer = pBufferCurrent; pBufferCurrent += sizeTotal; if ((iResult = ImageGet ( pBufferCurrent + sizeof(size), &size)) { break; } memcpy ( pBufferCurrent, &size, sizeof(size)); sizeTotal += (sizeof(size) + size); } while (1); ... 

这会按顺序存储您的数据:

 [ size 1 ][ image data 1 ][ size 2 ][ image data 2 ]... <-sizeof(size_t)-><- size 1 -><-sizeof(size_t)-><- size 2 -> 

pBuffer指向的缓冲区中。


要从缓冲区pBuffer检索对描述图像N的数据的引用,您可以使用以下方法:

 const char * BufferImageGetByIndex( const char * pBuffer, unsigned indexImage) { for (unsigned indexImageCnt = 0; indexImageCnt < indexImage; ++ indexImageCnt) { pBuffer += sizeof(size_t) + *((size_t *) pBuffer); } return pBuffer; } 

然后实际获得一个你可以这样做的图像:

 ... /* Get a reference to the data decribing **fourth** image in the buffer filled by the example above. */ const char * pBufferImage4 = *BufferImageGetByIndex(pBuffer, 3); /* Get the size ... */ size_t sizeImage4 = *((size_t *) pBufferImage4); /* ... and a reference to the image data. */ const char * pImage4 = pBufferImage4 + sizeof(size_t); ... 

假设您的图像都是标准尺寸和格式,您可以简单地malloc()一个缓冲区,它将在事件检测时保存所有图像。 如果您希望对图像进行任何分析,我建议您切换到C ++并使用OpenCV库。 它们在开源图像库中几乎没有并行。