-3

OpenCvを使用して、ライブビデオカメラ(パノラマのようなもの)から画像をステッチしようとしています。ステッチは正常に機能しています。私の問題は、ステッチをリアルタイムで時速30マイル程度で実行したいのですが、ステッチの処理が遅いということです。

スレッドを使用して速度を向上させたいのですが、スレッドを使用するには、ライブビデオストリームを保存する必要がありますか、ライブストリームにスレッドを直接使用する方法はありますか。

サンプルコードは次のとおりです。

  SapAcqDevice *pAcq=new SapAcqDevice("Genie_HM1400_1", false);
  SapBuffer *pBuffer = new SapBuffer(20,pAcq);
  SapView *pView=new SapView(pBuffer,(HWND)-1);
  SapAcqDeviceToBuf *pTransfer= new SapAcqDeviceToB(pAcq,pBuffer,XferCallback,pView);



  pAcq->Create();
  pBuffer->Create();
  pView->Create();

  pTransfer->Create();  
  pTransfer->Grab();

  printf("Press any key to stop grab\n");
  getch();

  pTransfer->Freeze();  
  pTransfer->Wait(5000);

  printf("Press any key to terminate\n");
  getch();

上記のコードは、ライブストリームをキャプチャするために使用されます。XferCallback関数は、フレームの処理を行うために使用されます。この関数では、ステッチエンジンを呼び出します。エンジンの処理が遅いので、スレッドを使いたいです。

コールバック関数のサンプルコードは次のとおりです。

SapView *pView = (SapView *) pInfo->GetContext();
SapBuffer *pBuffer;
pBuffer = pView->GetBuffer();

void *pData=NULL;
pBuffer->GetAddress(&pData);

int width=pBuffer->GetWidth();
int height=pBuffer->GetHeight();
int depth=pBuffer->GetPixelDepth();

IplImage *fram;
fram = cvCreateImage(cvSize(width,height),depth,1);
cvSetImageData(fram,pData,width);

stitching(frame_num , fram);

cvWaitKey(1);

frame_num++;

ステッチエンジンで多くのスレッドを動作させたいです。

4

1 に答える 1

0

糸を使って十分に速くステッチできると思うなら、それを選んでください。

ライブビデオストリームを保存する必要がありますか、それともライブストリームにスレッドを直接使用する方法はありますか?

事前に割り当てられたフレームを使用してリングバッファを設定すると、メリットが得られる場合があります。画像サイズは変わらないことをご存知でしょう。したがって、Sapera取得コールバックは、フレームをバッファにプッシュするだけです。

次に、可能な限り速くステッチし、次のステッチを最適化するのに役立つ状態情報を維持する別のスレッドがあります。ステッチングプロセスについてはあまり情報を提供していませんが、おそらくOpenMPと並行して作成することができます。それがフレーム取得に追いつくのに十分速いなら、あなたは大丈夫でしょう。そうでない場合は、リングバッファがいっぱいであるため、フレームのドロップを開始します。

上で示唆したように、おそらく次のフレームのステッチがどこから始まるべきかを予測することができます。これは、あるフレームと次のフレームの間の動きが適度に小さく、および/またはスムーズでなければならないことに基づいています。このようにして、検索を絞り込み、速度を大幅に向上させます。

于 2012-10-09T22:37:47.703 に答える