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++ 程序完美运行