【问题标题】:c++ opencv get encoded webcam streamc++ opencv获取编码的网络摄像头流
【发布时间】: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发送,所以我们希望数据尽可能小,解码的比编码的大
  • 如果你不能访问底层流来检查,你怎么知道它更小?在我看来,您最好研究如何对视频流进行转码。

标签: c++ opencv video-streaming webcam


【解决方案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。它具有简单和便携的优点,但图像重新编码会占用更多资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2013-08-12
    • 2016-05-02
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多