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

Image Stitching from a live Video Stream in OpenCv

本文关键字:图像拼接 实时视频 OpenCv      更新时间:2023-10-16

我正在尝试使用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 grabn");
getch();
pTransfer->Freeze();  
pTransfer->Wait(5000);
printf("Press any key to terminaten");
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++;

我想要许多线在缝纫机上工作。

如果你认为你可以用线缝得足够快,那就去吧。

我需要存储我的实时视频流吗直接使用线程进行直播。

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

然后,你有另一根线,它坐在那里以最快的速度缝合,并保持状态信息,以帮助优化下一次缝合。您没有给出太多关于缝合过程的信息,但据推测,您可以将其与OpenMP并行。如果这足够快,可以跟上帧采集,那么你就没事了。如果没有,那么您将开始丢弃帧,因为您的环形缓冲区已满。

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