c++ opencv获取编码的网络摄像头流

Posted

技术标签:

【中文标题】c++ opencv获取编码的网络摄像头流【英文标题】:c++ opencv get encoded webcam stream 【发布时间】:2015-05-26 04:45:43 【问题描述】:

我目前正在从事一个从网络摄像头捕获视频并通过 UDP 发送编码流以进行实时流式传输的项目。

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])

VideoCapture cap(0); // open the video camera no. 0

double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video

while (1)

    Mat frame;

    bool bSuccess = cap.read(frame); // read a new frame from video

if (!bSuccess) //if not success, break loop

cout << "Cannot read a frame from video stream" << endl;
break;

return 0;

有人说从 cap.read(frame) 得到的帧已经是解码帧,我不知道这是怎么发生的,什么时候发生的。我想要的是编码的帧或流。我应该怎么做才能得到它?我应该重新编码吗?

【问题讨论】:

为什么不直接使用解码帧? 因为我们需要通过UDP发送,所以我们希望数据尽可能小,解码的比编码的大 如果你不能访问底层流来检查,你怎么知道它更小?在我看来,您最好研究如何对视频流进行转码。 【参考方案1】:

根据the docs,调用VideoCapture::read()相当于调用VideoCapture::grab()然后调用VideoCapture::retrieve()

The docs for the Retrieve function 说它确实解码了帧。

为什么不直接使用解码帧;大概你会在任何情况下在远端解码它?

【讨论】:

因为我们需要通过UDP发送,所以我们希望数据尽可能小,解码的比编码的大【参考方案2】:

OpenCV API 不提供对编码帧的访问权限。

您将不得不使用更底层的库,可能取决于设备和平台。如果您的操作系统是 Linux,Video4Linux2 可能是一个选项,必须有适用于 Windows/MacOS 的等效库。您还可以查看mjpg-streamer,它的功能与您想要实现的功能非常相似(仅在 linux 上)。

请注意,图像的确切编码取决于您的网络摄像头,一些 USB 网络摄像头支持 mjpeg 压缩(甚至是 h264),但其他只能发送原始数据(通常在 yuv 颜色空间中)。

另一种选择是使用 Opencv 获取解码后的图像,然后重新编码,例如使用 imencode。它具有简单和便携的优点,但图像重新编码会占用更多资源。

【讨论】:

以上是关于c++ opencv获取编码的网络摄像头流的主要内容,如果未能解决你的问题,请参考以下文章

来自带有 Opencv C 程序的网络摄像头的灰色图像,但 C++ 程序完美运行

OpenCV 在不同线程上从网络摄像头运行视频

从网络摄像机捕获实时图像

通过网络摄像头实时采集视频,采用OpenCV识别运动物体,实现有运动物体经过时存储,没有时则不存储.

如何使用 opencv 获取网络摄像头设备列表?

使用 openCV 和 wxPython 从网络摄像头获取流