-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 回答