图像从OpenCv中的实时视频流拼接

时间:2012-10-09 21:56:36

标签: c++ multithreading visual-studio opencv image-stitching

我正在尝试使用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++;

我想要许多线程处理针脚引擎。

1 个答案:

答案 0 :(得分:0)

如果您认为使用线程可以足够快地获得拼接,那就去吧。

  

我需要存储我的直播视频流还是有任何方法   直接使用线程进行直播。

使用预先分配的帧设置环形缓冲区可能会受益。您知道图像大小不会改变。因此,您的Sapera采集回调只是将帧推入缓冲区。

然后你有另一个线程尽可能快地缝合在那里并保持状态信息以帮助优化下一针脚。您没有提供有关拼接过程的大量信息,但可能您可以将其与OpenMP并行。如果这足够快以跟上帧采集那么你会没事的。如果没有,那么你将开始丢帧,因为你的环形缓冲区已满。

如上所述,您可以预测下一帧的缝合应该从哪里开始。这是基于一帧和下一帧之间的移动应该相当小和/或平滑。这样可以缩小搜索范围并大大提高速度。