【问题标题】:Image Stitching from a live Video Stream in OpenCvOpenCv 中实时视频流的图像拼接
【发布时间】:2012-10-09 21:56:36
【问题描述】:

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

我希望缝合引擎上有很多线程。

【问题讨论】:

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


    【解决方案1】:

    如果您认为使用线可以足够快地缝合,那就去吧。

    我需要存储我的实时视频流还是有什么方法可以 直接使用线程进行直播。

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

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

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

    【讨论】:

    • 我想使用多线程以更快的速度进行处理。事实上,我正计划切换到 CUDA。就像你说的那样,拼接过程只是按顺序添加帧,结果图像是捕获的所有帧的拼接图像。你能给我一个示例代码吗?我是新手,无助。
    • 你甚至没有展示你现有的拼接代码,你要求我为你写一个平行的。我真的负担不起这样做的时间投资。我只是想提供一些可能有用的建议。
    • 拼接功能以帧和帧号为参数:stitching(frame_num , frame)。结果图像根据帧号堆叠。代码真的很长,我在这里输入。请原谅我。对于这个功能,我想使用线程。所以我想知道我是否需要存储视频而不是直接在回调函数中调用拼接函数。
    • 按照我的建议将帧存储在缓冲区中并从相机回调中返回是一种很好的做法。这样,您就不会将延迟推入捕获驱动程序并可能阻塞它。相反,如果您的处理跟不上,您只需丢帧。因为您可以控制处理线程中的帧缓冲区,所以您可以根据需要将帧保留在内存中。您可能会一次缝合一帧。这是您试图实现的非常开放的事情,而且无法回答。也许您需要发布更具体的优化问题。
    • 谢谢。我会尝试使用环形缓冲区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2011-08-26
    • 2020-07-13
    • 2019-04-10
    • 1970-01-01
    • 2019-06-05
    • 2014-03-30
    相关资源
    最近更新 更多