1

2台のカメラからPCで画像を受信します。ストリームは連続的ではありませんが、イベント検出時に発生します。したがって、特定の時間の後に約8〜10の画像ペアを受信する必要があります。画像を処理する必要があるため、最初にすべての画像を大きなバッファに保存し、後でバッチで処理したいと思います。画像を2つの大きなバッファ(カメラごとに1つ)に保持することもできます。これらの画像のペアを1つ(または2つ)の大きなバッファーに保持するにはどうすればよいですか?私はこのプログラムをCで実装しています。

4

2 に答える 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 に答える