我在 PC 上接收来自两个摄像头的图像。流不是连续的,而是在事件检测时发生。因此,我必须在特定时间后收到大约 8-10 对图像。由于我必须处理图像,我想首先将所有图像保存在一个大缓冲区中,然后再批量处理它们。将图像保存在两个大缓冲区(每个相机一个)中也是可以接受的。如何将这对图像保存在一个(或两个)大缓冲区中?我正在用 C 实现这个程序。
问问题
1445 次
2 回答
2
假设使用以下 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 <stdlib.h>
#include <string.h>
...
#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
。
要从缓冲区中检索对描述图像 N 的数据的引用,pBuffer
您可以使用以下方法:
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);
...
于 2012-05-01T15:16:22.740 回答
0
假设您的图像都是标准大小和格式,您可以简单地 malloc() 一个缓冲区,该缓冲区将在事件检测时保存所有图像。如果您希望对图像进行任何分析,我建议您切换到 C++ 并使用 OpenCV 库。它们在开源图像库中几乎没有并行。
于 2012-05-01T14:30:39.940 回答