Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过录像机发送帧;can';无法再次捕获它(OpenCV 3.1,c+;+;)_C++_Opencv_Gstreamer - Fatal编程技术网

C++ 通过录像机发送帧;can';无法再次捕获它(OpenCV 3.1,c+;+;)

C++ 通过录像机发送帧;can';无法再次捕获它(OpenCV 3.1,c+;+;),c++,opencv,gstreamer,C++,Opencv,Gstreamer,我正在尝试编写一个简单的视频流应用程序,它执行以下任务: 从相机获取一帧(该部件正在工作) 修改框架 发送到gstreamer管道 代码: VLC玩家无法使用命令查看任何内容: vlc -vvv rtp://@localhost:5000 我试过: cv::VideoCapture cap("udpsrc port=5000 ! tsparse ! videoconvert ! appsink"); 但是它没有启动(没有错误日志,只是没有得到任何帧)。 我使用的是OpenCV 3.1,我已经

我正在尝试编写一个简单的视频流应用程序,它执行以下任务:

  • 从相机获取一帧(该部件正在工作)
  • 修改框架
  • 发送到
    gstreamer
    管道
  • 代码:

    VLC玩家无法使用命令查看任何内容:

    vlc -vvv rtp://@localhost:5000
    
    我试过:

    cv::VideoCapture cap("udpsrc port=5000 ! tsparse ! videoconvert ! appsink");
    
    但是它没有启动(没有错误日志,只是没有得到任何帧)。 我使用的是OpenCV 3.1,我已经阅读了
    GStreamer
    的支持文档。
    有什么问题吗?

    在使用OpenCV的Gstreamer API之前,使用Gstreamer的命令行工具建立一个工作管道是很重要的

    发件人: 工作管道:

    gst-launch-1.0 -v v4l2src \
    ! video/x-raw, framerate=30/1, width=640, height=480, format=BGR \
    ! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 \
    ! rtpvrawpay ! udpsink host=127.0.0.1 port=5000
    
    bool sender()
    {
        VideoCapture cap = VideoCapture("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=BGR ! appsink",cv::CAP_GSTREAMER);
        VideoWriter out = VideoWriter("appsrc ! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 ! rtpvrawpay ! udpsink host=127.0.0.1 port=5000",CAP_GSTREAMER,0,30,Size(640,480));
    
        if(!cap.isOpened() || !out.isOpened())
        {
            cout<<"VideoCapture or VideoWriter not opened"<<endl;
            return false;
        }
    
        Mat frame;
    
        while(true)
        {
            cap.read(frame);
    
            if(frame.empty())
                break;
    
           /* Modify frame here*/
    
            out.write(frame);
    
            imshow("frame", frame);
            if(waitKey(1) == 'q')
                break;
        }
    
        cap.release();
        out.release();
        return true;
    }
    
    OpenCV代码:

    gst-launch-1.0 -v v4l2src \
    ! video/x-raw, framerate=30/1, width=640, height=480, format=BGR \
    ! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 \
    ! rtpvrawpay ! udpsink host=127.0.0.1 port=5000
    
    bool sender()
    {
        VideoCapture cap = VideoCapture("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=BGR ! appsink",cv::CAP_GSTREAMER);
        VideoWriter out = VideoWriter("appsrc ! videoconvert ! video/x-raw, format=I420, width=640, height=480, framerate=30/1 ! rtpvrawpay ! udpsink host=127.0.0.1 port=5000",CAP_GSTREAMER,0,30,Size(640,480));
    
        if(!cap.isOpened() || !out.isOpened())
        {
            cout<<"VideoCapture or VideoWriter not opened"<<endl;
            return false;
        }
    
        Mat frame;
    
        while(true)
        {
            cap.read(frame);
    
            if(frame.empty())
                break;
    
           /* Modify frame here*/
    
            out.write(frame);
    
            imshow("frame", frame);
            if(waitKey(1) == 'q')
                break;
        }
    
        cap.release();
        out.release();
        return true;
    }
    

    问题是我的openCV版本不支持gstreamer的VideoWriter。我把它改为3.3.0,它就可以工作了。

    你能显示更多的代码吗?尚不清楚
    帧的来源。我有一个关于Gstream的问题,以及它们应用于帧的过滤器。。您能检查一下这个问题吗?这似乎是OpenCV 3.3.0以来的新版本(以前的版本中没有提到备用后端)。