首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于存储多个图像的内存缓冲区

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

Stack Overflow用户
提问于 2012-05-01 22:24:50
回答 2查看 1.4K关注 0票数 1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-01 23:16:23

获取镜像的接口如下:

代码语言:javascript
运行
复制
int ImageGet(
  char * pBuffer, 
  size_t * pSize); /* returns 0 on success or any other value if no image is available or on error */

您可以执行以下操作:

代码语言:javascript
运行
复制
#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);

...

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

代码语言:javascript
运行
复制
[     size 1     ][  image data 1  ][     size 2     ][  image data 2  ]...
<-sizeof(size_t)-><-    size 1    -><-sizeof(size_t)-><-    size 2    ->

pBuffer指向的缓冲区中。

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

代码语言:javascript
运行
复制
const char * BufferImageGetByIndex(
    const char * pBuffer,
    unsigned indexImage)
{
  for (unsigned indexImageCnt = 0;
    indexImageCnt < indexImage;
    ++ indexImageCnt)
  {
    pBuffer += sizeof(size_t) + *((size_t *) pBuffer);
  }

  return pBuffer;
}

然后,要实际获得图像,您可以这样做:

代码语言:javascript
运行
复制
...
/* 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);
...
票数 2
EN

Stack Overflow用户

发布于 2012-05-01 22:30:40

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10399095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档