OpenCv中实时视频流的图像拼接
Image Stitching from a live Video Stream in OpenCv
我正在尝试使用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并行。如果这足够快,可以跟上帧采集,那么你就没事了。如果没有,那么您将开始丢弃帧,因为您的环形缓冲区已满。
如上所述,您可能可以预测下一帧的缝合应该从哪里开始。这是基于一帧和下一帧之间的移动应该相当小和/或平滑。这样可以缩小搜索范围,大大提高搜索速度。
相关文章:
- 完整Windows桌面的实时视频处理
- 如何从DJI Professional 3相机中播放实时视频
- 在c++中使用opencv捕获实时视频
- OpenCv中实时视频流的图像拼接
- 来自图像的简单视频制作器
- 视觉C++库,用于在不使用Opencv的情况下将一组图像转换为视频
- Qt:显示实时视频,一次一帧
- 使用OpenCv和多线程的IP摄像机实时视频馈送
- C++ ffmpeg 实时视频传输
- 实时视频捕获 c++ 库
- OpenCV将浮点数据馈送到图像拼接过程中
- 检测实时视频上的冲浪点
- 矢量<矢量>ROI的图像拼接使用<Rect>
- 实时视频上的霍夫线变换会导致断点
- 使用 Live555 从连接到 H264 编码器的 IP 摄像机流式传输实时视频
- 将延时图像附加到视频文件
- 不保存任何图像。保存视频帧时
- 如何使用OpenCV在一个窗口中显示一个图像和一个视频
- 图像拼接细节与OpenCV
- Opencv/在线程中录制实时视频,在另一个线程中处理图像