繁体   English   中英

OpenCV如何有效地编码和发送网络摄像头视频流的数据?

[英]OpenCV how to encode and send data of webcam video stream efficiently?

我有这个OpenCV C ++代码,它从凸轮上获取图像,对其进行编码并将其发送到STDOUT。

#include <unistd.h> //STDOUT_FILENO
#include "opencv2/opencv.hpp"
#include <iostream>
#include <fcntl.h>
using namespace std;
using namespace cv;

#define BUFLEN 4096

int main(int argc, char *argv[])
{
    Mat frame;
    std::vector<uchar> buf;

    int bak, temp;

    //read image as grayscale
    namedWindow( "Camera", WINDOW_AUTOSIZE );
    //redirect stdout to NULL in order to avoid printing to STDOUT undesired stuff
    fflush(stdout);
    bak = dup(1);
    temp = open("/dev/null", O_WRONLY);
    dup2(temp, 1);
    close(temp  );
    VideoCapture cam(0 + CAP_V4L);
    cam>>frame;
    sleep(1);
    if (!cam.isOpened())
    {
        cout << "\nCould not open reference " << 0 << endl;
        return -1;
    }
    for (int i=0; i<5; i++)
    {
        cam>>frame;
    }
    /*Set the normal STDOUT back*/
    fflush(stdout);
    dup2(bak, 1);
    close(bak);

    //encode image and put data into the vector buf
    imencode(".png",frame, buf);
    //send the total size of vector to parent
    cout<<buf.size()<<endl;
    unsigned int written= 0;

    int i = 0;
    size_t toWrite = 0;
    //send until all bytes have been sent
    FILE * f = fdopen(STDOUT_FILENO, "w");
    while (written<buf.size())
    {
        //send the current block of data
        toWrite = BUFLEN < (buf.size()-written) ? BUFLEN : (buf.size()-written);
        //written += write(STDOUT_FILENO, buf.data()+written, toWrite);
        written += toWrite*fwrite ( buf.data()+written, toWrite, 1, f );
        i++;
    }
    return 0;
}

现在,而不是图像,我想从凸轮拍摄无限连续视频。 一种解决方案是在任何给定的秒内采用帧,对帧进行编码并将其传输(将其打印到STDOUT),所有动作都在无限循环内。

是否有更好的解决方案,比编码更有效,并在每次迭代时发送每个帧?

基本上,视频流是预定义顺序的帧序列。

您可以简单地将帧作为图像一个接一个地发送。 这没有什么根本性的错误,但不一定是最优的(这也取决于你对最优的定义)。

在通信中,其中一个方面是最小化传输的数据量。 只需将帧作为图像发送即可进行一些压缩(例如jpeg)。 用于视频的更好的压缩算法(例如mpeg)使用序列的时间属性。 如果存在(大多数)静态帧,则可以限制自己发送有关更改部分的数据并假设背景相同。 这与通信两端的一些处理有关,但可能会提高通信速度(假设链路是瓶颈)。 这也会给系统增加很多复杂性,因此首先考虑潜在的优势(找出瓶颈)。

我不确定您的应用程序的用途,但将视频流发送到stdout可能不一定是最好的主意。 考虑使用管道或套接字(后者允许您很容易通过网络传输数据,这可能是一个很好的结果)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM