WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

这篇具有很好参考价值的文章主要介绍了WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

本篇博客的由来如上图哈哈,WSL2 相关安装教程可以参考我之前的博客:Win11安装WSL2和Nvidia驱动

更多文章欢迎来我的博客小站看呀,会有更多的技术细节~

安装 CMake

ubuntu上请执行

sudo apt install cmake -y

或者编译安装

# 以v3.25.1版本为例
git clone -b v3.25.1 https://github.com/Kitware/CMake.git 
cd CMake
# 你使用`--prefix`来指定安装路径,或者去掉`--prefix`,安装在默认路径。
./bootstrap --prefix=<安装路径> && make && sudo make install

# 验证
cmake --version

如果报错Could NOT find OpenSSL,安装如下依赖即可解决

sudo apt update
sudo apt upgrade
sudo apt install libssl-dev

安装 OpenCV 和 FFmpeg

sudo apt install libopencv-dev
sudo apt install ffmpeg

启动 Windows 本机的 RTSP 视频流

下载解压 EasyDarwin

Easydarwin是国内团队开发的开源流媒体框架。它是基于Go语言研发,从2012年12月创建并发展至今,从原有的单服务的流媒体服务器形式,扩展成现在的云平台架构开源项目,属于高性能开源RTSP流媒体服务器,在Github上受到广大欢迎。

特点:RTSP推模式转发、RTSP拉模式转发、录像、检索、回放、关键帧缓存、秒开画面、RESTful接口、WEB后台管理、分布式负载均衡。

下载解压 release 包

直接运行 EasyDarwin.exe

以 Ctrl + C 停止服务。打开浏览器输入 http://localhost:10008, 进入控制页面,默认用户名密码是admin/admin

查看本机摄像头设备

Windows 本机安装 ffmpeg 这里不再赘述啦,网上教程很多~

查看本机摄像头设备命令如下

ffmpeg -list_devices true -f dshow -i dummy

WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

开始推流

ffmpeg -f dshow -i video="USB2.0 Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://192.168.1.101/test

参数解释

  • -f dshow -i video="摄像头名称" 指定从本地摄像头中读取视频流。将“摄像头名称”替换为您的摄像头名称,例如“USB2.0 Camera”。
  • -vcodec libx264 指定使用 x264 编码器进行视频编码。
  • -preset ultrafast 设置编码速度。这里使用的是最快的编码速度,但可能会导致视频质量下降。
  • -tune zerolatency 设置编码器以实现零延迟。
  • -f rtsp 指定输出流的格式为 RTSP。
  • rtsp://<IP地址>/<路径> 指定 RTSP 流的目标地址。请将 <IP地址> 替换为 Windows 本机 IP 地址,将 <路径> 替换为您想要为流指定的路径。

成功推流如下,注意保持控制台的运行

WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

开放本机防火墙(可选)

因为我们要在 WSL2 里访问本机的 RTSP 视频流,所以需要打开本机的防火墙,如下图

WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

关闭专用网络和公用网络即可

用 OpenCV 接收视频流

代码如下

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

int main(int argc, char **argv)
{
    // Ubuntu安装ffmpeg:sudo apt-get install ffmpeg
    // rtsp地址,模拟四路视频流进行展示
    std::string rtsp1 = "rtsp://172.27.148.34/test";
    std::string rtsp2 = rtsp1;
    std::string rtsp3 = rtsp1;
    std::string rtsp4 = rtsp1;

    // CAP_FFMPEG:使用ffmpeg解码
    cv::VideoCapture stream1 = cv::VideoCapture(rtsp1, cv::CAP_FFMPEG);
    cv::VideoCapture stream2 = cv::VideoCapture(rtsp2, cv::CAP_FFMPEG);
    cv::VideoCapture stream3 = cv::VideoCapture(rtsp3, cv::CAP_FFMPEG);
    cv::VideoCapture stream4 = cv::VideoCapture(rtsp4, cv::CAP_FFMPEG);

    if (!stream1.isOpened() || !stream2.isOpened() || !stream3.isOpened() || !stream4.isOpened())
    {
        std::cout << "有视频流未打开" << std::endl;
        return -1;
    }

    cv::Mat frame1;
    cv::Mat frame2;
    cv::Mat frame3;
    cv::Mat frame4;

    cv::Mat H1, H2, V, blur;

    // 使用namedWindow创建窗口,WINDOW_AUTOSIZE:自动调整窗口大小
    cv::namedWindow("rtsp_demo", cv::WINDOW_AUTOSIZE);

    while (true)
    {
        if (!stream1.read(frame1) || !stream2.read(frame2) || !stream3.read(frame3) || !stream4.read(frame4))
        {
            std::cout << "有视频流未读取" << std::endl;
            continue;
        }
        // 缩放等处理
        cv::resize(frame1, frame1, cv::Size(500, 300));

        cv::resize(frame2, frame2, cv::Size(500, 300));
        cv::flip(frame2, frame2, 1);

        cv::resize(frame3, frame3, cv::Size(500, 300));
        cv::cvtColor(frame1, frame1, cv::COLOR_BGR2GRAY);
        cv::cvtColor(frame1, frame1, cv::COLOR_GRAY2BGR);

        cv::resize(frame4, frame4, cv::Size(500, 300));
        cv::putText(frame4, "RTSP demo", cv::Point(100, 100), cv::FONT_ITALIC, 1, cv::Scalar(0, 0, 255), 2);
        // 拼接
        cv::hconcat(frame1, frame2, H1);
        cv::hconcat(frame3, frame4, H2);
        cv::vconcat(H1, H2, V);

        // 高斯模糊一下
        cv::GaussianBlur(V, blur, cv::Size(25, 25), 0);

        cv::imshow("rtsp_demo", blur);

        if (cv::waitKey(1) == 27)
        {
            break;
        }
    }

    return 0;
}

CMakeLists.txt 内容如下

# 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 项目信息
project(rtsp_demo)

# 添加opencv库
find_package(OpenCV REQUIRED)

# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加库文件
link_libraries(${OpenCV_LIBS})

# 添加可执行程序
add_executable(rtsp_demo src/main.cpp)

启动 cmake 配置并构建

cmake -S . -B build 
cmake --build build 

运行可执行程序

./build/rtsp_demo

结果展示

成功用 WSL2 展示出四路 RTSP 视频流~

WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流文章来源地址https://www.toymoban.com/news/detail-489922.html

到了这里,关于WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 使用OpenCV调用摄像头

    1.创建一个摄像头调用的空项目 2.添加上篇博客里已经改好的属性表——现有属性表 3.返回解决方案资源管理器,在源文件里添加新建项命名为摄像头调用 4.输入以下代码,开始调试,然后就会弹出摄像头 #include opencv2/highgui/highgui.hpp  #include opencv2/imgproc/imgproc.hpp  #include ope

    2024年02月05日
    浏览(50)
  • 如何使用Opencv调用电脑摄像头?

    当我们想要使用opencv对视频图像进行处理时,往往第一步便是需要调用电脑摄像头,下面博主将提供两种版本的代码(含详细注释),帮助大家学习如何使用Opencv调用电脑摄像头进行视频录制并保存: 一、C++版本 1. 从相机中读取视频 2. 从文件中读取视频 3. 保存视频 二、P

    2024年02月11日
    浏览(56)
  • opencv调用海康威视工业摄像头

    opencv调用海康威视工业摄像头需要用到官方接口VideoCapture() 接口:cv2.VideoCapture() 作用:获取本地目录下的视频文件或者使用本电脑的摄像头获取实时数据;  “0” ,调用的是本地电脑摄像头 “1” ,调用的是外接摄像头 打开MVS  正常设置使画面正常  然后找到宽度和长度

    2024年02月13日
    浏览(53)
  • python实现opencv调用摄像头

    Python的opencv库提供了一种简单而高效的方法来处理图像,包括从摄像头中读取视频流。在本篇技术博客中,我们将介绍如何使用Python的opencv库调用IP摄像头和本地摄像头的代码。 首先,我们需要安装Python的opencv库,可以使用pip install opencv-python命令进行安装。 在使用IP摄像头之

    2024年02月11日
    浏览(47)
  • 使用opencv调用外接摄像头

    当我们使用opencv调用摄像头的命令 cv2.VideoCapture(0),可能会出现下面这个错误。 [ERROR:0@0.433] global obsensor_uvc_stream_channel.cpp:156 cv::obsensor::getStreamChannelGroup Camera index out of range 表明在尝试获取摄像机流通道组时,使用的摄像机索引超出了有效范围。这通常意味着你尝试访问的摄

    2024年02月03日
    浏览(59)
  • 【计算机视觉 · OpenCV】使用 OpenCV 调用手机摄像头

    Droidcam 是一款可以将手机变成网络摄像头的工具,我们可以利用 Droidcam 让 OpenCV 拥有调用手机摄像头的能力。 2.1 安装 DroidCam 在手机和电脑上分别安装 DroidCam 的客户端和服务端 下载地址:https://pan.baidu.com/s/1DrBn3P1Bx-SXa4d6oziifA?pwd=gr1o 提取码:gr1o 2.2 测试连接状态 手机和电脑需

    2024年02月09日
    浏览(52)
  • 使用OpenCV调用摄像头和读取视频图片

    要捕获视频,你需要创建一个 VideoCapture 对象。它的参数是设备索引的名称。设备索引就是指定哪个摄像头的数字。正常情况下,内部摄像头可以通过传入0来调用,传递1来选择外置的第二个相机,以此类推。在此之后,你可以逐帧捕获。但是在最后,不要忘记释放俘虏。 直

    2024年02月08日
    浏览(53)
  • Python进阶,使用 opencv 调用摄像头进行拍照

             opencv 支持 Python 版本的模块叫作 opencv-p hon ,可直接使用 pip install opencv-python 令进行安装,但常常会因为网络等问题导致失败。推荐使用离线模式来安装 opencv 模块。 下载完安装包后,使用如下命令进行安装: D: pip install opencv

    2024年02月11日
    浏览(69)
  • 4.通过Opencv采集摄像头视频数据

    VideoCapture() 虚拟采集器,一般设备号从0开始 cap.read() 读取视频帧 返回值有两个,第一个为状态值,读到帧为true 第二个值为视频帧 cap.release() 释放资源 示例程序: 运行结果: 从视频文件中读取视频帧 只处理视频,不处理音频,所以读取到的视频没有声音 播放速度设置 Vi

    2023年04月22日
    浏览(46)
  • 通过Opencv打开指定摄像头的方法

    我们使用Opencv打开摄像头,一般是使用VideoCapture的open接口。 open接口要传入一个标识符,如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。 系统: 银河麒麟linux系统 问题: 现在我插入了一个双目摄像头(两个USB线,一个彩色,一个红

    2024年02月13日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包