opencv+gstreamer拉流

这篇具有很好参考价值的文章主要介绍了opencv+gstreamer拉流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

opencv的VideoCapture函数支持以Gstreamer pipeline的方法对RTSP数据进行解码,VideoWriter函数支持以Gstreamer pipeline的方式进行RTSP推流。
为了实现上述的功能,opencv在编译时需要打开WITH_GSTREAMER选项,具体编译过程,需要后续进行测试,然后描述相应的过程。

查看opencv是否支持gstreamer

opencv中可以通过调用getBuildInformance函数查看opencv的编译情况,具体如下所示:

#include <opencv2/opencv.hpp>

int main(void)
{
  std::cout << cv::getBuildInformation() << std::endl;
}

通过运行上述命令可以得到如下输出,其中Video I/O中可以找到Gstreamer选项是否打开。
image.png
image.png

RTSP拉流

OpenCV的VideoCapture类支持视频文件、图像序列或摄像头作为输入,获取数据。在这小节中,重点介绍如何使用VideoCapture类来拉取RTSP流媒体数据。
通过调用如下的VideoCapure构造函数能实现对RTSP流数据的拉取:

cv::VideoCapture::VideoCapture	(	const String & 	filename,
									int 	apiPreference 	
)	

其中filename的输入可以是:

  • 视频文件路径;
  • 图像序列,例如图像序列名为image_00.jpg, image_01.jpg, image_02.jpg, 则可以设置为image_%02d.jpg;
  • 视频流的URL,例如:rtsp://admin@password:192.168.170.XXX;
  • Gstreamer的pipeline string,该pipeline可以使用gst-launch-1.0测试可用性;

apiPreference指的是Capture API使用何种后端,包括cv::CAP_FFMPEG or cv::CAP_IMAGES or cv::CAP_DSHOW等。

软件解码

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
#include <string>
using namespace cv;
using namespace std;
int main(int, char**)
{
    Mat frame;
    //--- INITIALIZE VIDEOCAPTURE
    VideoCapture cap;
    string rtsp_url = "rtsp://admin:password@192.168.170.xxx:554";
    int apiID = cv::CAP_ANY;      // 0 = autodetect default API
    // open rtsp stream using selected API
    cap.open(rtsp_url, apiID);
    // check if we succeeded
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }
    //--- GRAB AND WRITE LOOP
    cout << "Start grabbing" << endl
        << "Press any key to terminate" << endl;
    for (;;)
    {
        // wait for a new frame from camera and store it into 'frame'
        cap.read(frame);
        // check if we succeeded
        if (frame.empty()) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        // show live and wait for a key with timeout long enough to show images
        imshow("Live", frame);
        if (waitKey(5) >= 0)
            break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

上述代码默认采用软件解码,使用CPU资源进行数据解码,但是对于NVIDIA Jetson嵌入式平台,CPU资源非常宝贵,可以使用NVDEC硬件解码器来实现流数据的硬件解码。

硬件解码

如VideoCapture定义所示,其接收gstreamer的pipeline string来拉取数据。因此,gstreamer进行硬件解码的流程如下图所示:
image.png
与其他博客不同,本文使用nvv4l2decoder替代了之前的omxh264dec,nvvidconv替换为nvvideoconvert,下面硬件解码的代码在NVIDIA的dGPU和Jetson平台都可以使用

#include <opencv2/opencv.hpp>
#include <iostream>
#include <chrono>


int main()
{
    using std::chrono::steady_clock;
    typedef std::chrono::milliseconds milliseconds_type;
    const int interval = 15;

    std::stringstream ss;
    std::string rtsp_url = "rtsp://admin:password@192.168.170.xxx:554";
    size_t latency = 200;
    size_t frame_width = 1920;
    size_t frame_height = 1080;
    size_t framerate  = 15;

    ss << "rtspsrc location=" << rtsp_url << " latency=" << latency << " ! application/x-rtp, media=video, encoding-name=H264 "
       << "! rtph264depay ! video/x-h264, clock-rate=90000, width=" << frame_width << ", height=" << frame_height << ", framerate="
       << framerate << "/1 ! nvv4l2decoder ! video/x-raw(memory:NVMM), width=" << frame_width << ", height=" << frame_height 
       << ", framerate=" << framerate << "/1 ! nvvideoconvert ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink";
    std::cout << ss.str() << std::endl;

    cv::VideoCapture cap = cv::VideoCapture(ss.str(), cv::CAP_GSTREAMER);
    if(!cap.isOpened())
    {
        std::cerr << "error to open camera." << std::endl;
        return -1;
    }
    std::cout << cv::getBuildInformation() << std::endl;
    cv::Mat frame ;
    steady_clock::time_point start = steady_clock::now();
    size_t frame_idx = 0;

    while(1)
    {
        bool ret = cap.read(frame);
        if(ret)
        {
            // cv::imwrite("tmp.jpg", frame);
            ++frame_idx;
        }
        if(frame_idx % interval == 0)
        {
            steady_clock::time_point end = steady_clock::now();
            milliseconds_type span = std::chrono::duration_cast<milliseconds_type>(end - start) ;
            std::cout << "it took " << span.count() / frame_idx << " millisencods." << std::endl;
            start = end;
        }
    }
    return 0;
}

其中上面几个关键参数需要与所拉取RTSP的设置一致,大家可以通过IP摄像头的网页查看相关信息,两个重要的参数是图像分辨率和视频帧率,如下图所示:
image.png
CMakeLists文件内容如下:

# requirement of cmake version
cmake_minimum_required(VERSION 3.5)
# project name
PROJECT(opencv_test)

# find required opencv
find_package(OpenCV REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})

# name of executable file and path of source file
add_executable(${PROJECT_NAME} opencv_test.cpp)
# opencv libraries
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

对比实验

为了比较Jetson TX2下RTSP流媒体数据在软件解码和硬件解码下耗时,分别统计了其50s的平均耗时,结果如下所示,其中视频帧率为15FPS,分辨率为1080p,时间仅包含数据read的时间,未包含imwrite的时间:

image.png

正常来说,视频帧率为15FPS,则应该1000/15ms产生一帧数据,因此,平均耗时没有错误。但是,可以看到的是在硬件解码的情况下CPU资源的占用仅约为软件解码的一半,所以,在嵌入式平台下,使用硬件解码数据能大大减少CPU资源的占用文章来源地址https://www.toymoban.com/news/detail-442210.html

到了这里,关于opencv+gstreamer拉流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【报错处理】Pycharm使用OpenCV函数时提示“`cannot find reference ‘VideoCapture‘ in __init__.py`“

    Pycharm使用OpenCV函数时提示\\\" cannot find reference \\\'VideoCapture\\\' in __init__.py \\\" 在stackoverflow上找到了适合我的解决方法,方案步骤如下: 打开设置-Python Interpreter: 选择Show All: 点击’文件夹-子文件夹’图标: 添加路径 ...venvlibpython3.9site-packagescv2 至末尾: 一路ok确认,回到主界面

    2024年02月11日
    浏览(35)
  • 【MediaFoundation】OpenCV VideoCapture 读取音频源码

    在windows7 以及OpenCV4 过后可以使用 CAP_MSMF 读取音频,但是OpenCV没有播放音频的API。代码示例如下。 本文解析OpenCV CAP_MSMF 进行文件、设备的 音频读取,学习MediaFoundation 的使用。 配置音频流 configureAudioOutput 初始化流 initStream OpenCV捕获设备数据,采用异步模式,需要自定义一个

    2024年02月02日
    浏览(31)
  • 使用OpenCV的VideoCapture调整USB相机的对焦参数

            我们在进行机器视觉图像采集任务的之前,可能会选择购买一些USB相机作为采集设备。而有些USB相机具有自动对焦的功能,打开Windows自带的相机,界面如下:          拥有调整对焦功能的相机在接入之后,最左侧会出现对焦按钮(红框已圈出),点击按钮后拖

    2024年02月12日
    浏览(28)
  • Opencv VideoCapture File, Web Camera, RTSP stream

    Video capture in OpenCV is a really easy task, but for a little bit experienced user. What is the problem? The problem is the installation of Opencv without recommended dependencies. Just install all basic libs that are recommended on the website. You need to download and build my own in the case of Debian Jessie or some version of Ubuntu. Just download, and

    2024年02月19日
    浏览(26)
  • 【ffmpeg】基于需要使用videocapture的opencv编译配置(C++)

    opencv使用videocapture读取视频流时,需要借助底层的ffmpeg库。如果不能正确编译,会报错,现记录正确编译配置方法。 opencv依赖于ffmpeg,应该先编译ffmpeg。 同样需要安装gstreamer 依赖齐全后,按如下选型编译opencv(带opencv_contrib包) opencv的完整编译安装方法链接

    2024年02月11日
    浏览(28)
  • opencv python 相机启动慢问题 VideoCapture 感觉c++同理

    着急看去下面看结果 首先先说一下总共我自己的环境加上我找朋友帮忙测试的环境 系统 win10 win11 都有 环境包含 python310 ue整套c++开发环境 前端环境 后端环境 摄像头牌子 包含 笔记本自带 雷蛇灵刃15---小米3050ti的游戏本---mac pro m1pro usb独立摄像头,为了避免型号误差,直接截

    2024年02月07日
    浏览(34)
  • Python-OpenCv中的cv2.VideoCapture()类

    cv2.VideoCapture()具有两个功能,一是可以完成摄像头的初始化,打开摄像头;二是可以完成视频文件的初始化。 参数说明:         capture :要打开的摄像头         index :摄像头的设备索引,对于笔记本电脑来说,为0时,一般打开的是电脑的内置摄像头,为1时,打开的为外

    2024年01月25日
    浏览(26)
  • 【边缘设备】RK3588 用 opencv 的 videocapture 一直无法读取视频

    问题描述 : 我这边用的是 rk3588 的核心板,刷的固件里面有 opencv 4.5.5 , 系统是 ubuntu 20.04 LTS 版本, 使用 cv::VideoCapture 无法读取 mp4 或其他视频,每次读取后 isOpened() 都是 false; 硬件是 rk3588 对应的开发板 以下编译安装直接在开发板上进行,不是在宿主机用交叉编译链编译安装

    2024年02月17日
    浏览(37)
  • cv2.VideoCapture使用,opencv读取摄像头,视频图像

            cv2.VideoCapture()用于读取视频,也可以用于读取摄像头图像。         上面的2种写法,第一种表示读取摄像头,第二种读取视频文件,返回值就是视频数据。         在读取到视频后,可以使用isOpened方法来判断视频是否能够打开,能打开返回True,不能够打

    2024年02月12日
    浏览(64)
  • OpenCV VideoCapture使用方法(视频文件、摄像头、网络视频文件)

    cv::VideoCapture既支持视频文件的读取,也支持从摄像机中视频的读取。cv::VideoCapture对象的创建方式有以下三种: 方式一:     cv::VideoCapture capture(     const string filename, // 输入视频文件路径名     ); 方式二:     cv::VideoCapture capture(     int device // 输入摄像机视频捕捉设备

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包