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

news2024/11/15 15:31:30

文章目录

    • 前言
    • 安装 CMake
    • 安装 OpenCV 和 FFmpeg
    • 启动 Windows 本机的 RTSP 视频流
      • 查看本机摄像头设备
      • 开始推流
    • 开放本机防火墙
    • 用 OpenCV 接收视频流
    • 结果展示

前言

本篇博客的由来如上图哈哈,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 视频流

查看本机摄像头设备

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

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

ffmpeg -list_devices true -f dshow -i dummy

开始推流

ffmpeg -f dshow -i video="USB2.0 Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://172.27.148.34/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 里访问本机的 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 视频流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如果我只有一个奔腾CPU,怎么加速推理神经网络?

前言 有人说当下的AI热潮不过是算力堆砌的产物。现在层出不穷的各种大模型大训练集&#xff0c;使用复杂精致的技术在排行榜上不断刷新分数&#xff0c;这些人似乎忘了一件事情&#xff0c;AI模型最终是要落地的&#xff0c;是要用的&#xff0c;如果不能普及开去那和在象牙塔…

2023年最新软著申请流程(一):软件著作权说明、国家版权官网的账号注册与实名认证

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/129230460 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

如何使用Cliam测试云端环境IAM权限安全

关于Cliam Cliam是一款针对云端安全的测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松枚举目标云端环境的IAM权限。当前版本的Cliam支持下列云端环境&#xff1a;AWS、Azure、GCP和Oracle。 Cliam同时也是一个云端权限识别工具&#xff0c;该工具是一…

Mapper代理开发——书接MaBatis的简单使用

在这个mybatis的普通使用中依旧存在硬编码问题,虽然静态语句比原生jdbc都写更少了但是还是要写&#xff0c;Mapper就是用来解决原生方式中的硬编码还有简化后期执行SQL UserMapper是一个接口&#xff0c;里面有很多方法&#xff0c;都是一一和配置文件里面的sql语句的id名称所对…

HEC-HMS和HEC-RAS快速入门、防洪评价报告编制及洪水建模、洪水危险性评价等应用

目录 ①HEC-RAS一维、二维建模方法及实践技术应用 ②HEC-HMS水文模型实践技术应用 ③新导则下的防洪评价报告编制方法及洪水建模实践技术应用 ④基于ArcGIS水文分析、HEC-RAS模拟技术在洪水危险性及风险评估 ⑤山洪径流过程模拟及洪水危险性评价 ①HEC-RAS一维、二维建模方…

Torch同时训练多个模型

20230302 引言 在进行具体的研究时&#xff0c;利用Torch进行编程&#xff0c;考虑到是不是能够同时训练两个模型呢&#xff1f;&#xff01;而且利用其中一个模型的输出来辅助另外一个模型进行学习。这一点&#xff0c;在我看来应该是很简单的&#xff0c;例如GAN网络同时训…

docker安装rabbitmq并挂载

1、拉取镜像 management&#xff1a;表示可以通过web页面管理。 alpine&#xff1a;表示是linux最小版本&#xff0c;不推荐新手安装。 docker pull rabbitmq:management2、创建用于挂载的目录 mkdir -p /mydata/rabbitmq/{data,conf,log} # 创建完成之后要对所创建文件授权…

从菜鸟程序员到高级架构师,竟然是因为这个字final

final实现原理 简介 final关键字&#xff0c;实际的含义就一句话&#xff0c;不可改变。什么是不可改变&#xff1f;就是初始化完成之后就不能再做任何的修改&#xff0c;修饰成员变量的时候&#xff0c;成员变量变成一个常数&#xff1b;修饰方法的时候&#xff0c;方法不允…

23种设计模式之简单工厂模式

一、场景简介 1、引入场景 订餐流程简单描述 食品抽象类,规定食品的基础属性操作 鱼类,鸡肉类食品类扩展 订餐流程类,根据食品名称,加工指定类型食品 模拟客户端预定操作 2、源代码实现 关系图谱 代码实现 /*** 简单工厂模式引入场景*/ public class C01_InScene { p…

【word】论文排版思路

1、 首先把所有中文的字体都按照要求改一下&#xff0c;记住都改成正文的字号和字体&#xff0c;后面再修改标题的&#xff0c;然后再改英文的&#xff0c;不要把顺序弄错了&#xff0c;不然得回头再改标题 然后定位文章里所有英文方法如下&#xff1a; 按CTRLF打开替换对话…

记录--虚拟滚动探索与封装

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1. 介绍 什么是虚拟滚动&#xff1f;虚拟滚动就是通过js控制大列表中的dom创建与销毁&#xff0c;只创建可视区域dom&#xff0c;非可视区域的dom不创建。这样在渲染大列表中的数据时&#xff0c;只创…

快速生成QR码的方法:教你变成QR Code Master

目录 简介: 具体实现步骤&#xff1a; 一、可以使用Python中的qrcode和tkinter模块来生成QR码。以下是一个简单的例子&#xff0c;演示如何在Tkinter窗口中获取用户输入并使用qrcode生成QR码。 1&#xff09;首先需要安装qrcode模块&#xff0c;可以使用以下命令在终端或命令…

aws batch 理解和使用batch进行批处理计算

文档 Compute Resource Memory ManagementRunning Workload on AWS Batch aws batch 是云上的批处理平台&#xff0c;通过托管环境减少了管理成本。包括配置大量计算资源&#xff0c;更具任务负载优化资源分配。 基本概念 job&#xff08;任务&#xff09;&#xff0c;提交到…

C语言-结构体【详解】

一、 结构体的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量结构的每个成员可以是不同类型的变量 &#xff08;1&#xff09;结构体的声明 写法一&#xff1a; 注&#xff1a; 括号后边的分号不能忘结构体末尾可以不创建变量&#xff0c;在主函数中再创建 struc…

【ChatGPT】sqlachmey 多表连表查询语句

感受下科技带来的魅力&#xff0c;这篇文章是通过ChatGPT自动生成的&#xff0c;不得不说技术强大!!! 在SQLAlchemy中进行多表连接查询可以使用join()方法或join()函数&#xff0c;具体用法如下&#xff1a; join()方法 join()方法可以在SQLAlchemy ORM中的查询中使用。假设…

根据指定函数对DataFrame中各元素进行计算

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】根据指定函数对DataFrame中各元素进行计算以下错误的一项是?import numpy as npimport pandas as pdmyDict{A:[1,2],B:[3,4]}myDfpd.DataFrame(myDict)print(【显示】myDf)print(myDf)print(【…

SMILES标准化方法以及其中的一个坑(手性)

rdkit.Chem.MolToSmiles()方法是用于将RDKit分子对象转换为SMILES字符串的方法。它的参数如下&#xff1a; mol&#xff1a;必需&#xff0c;要转换为SMILES字符串的RDKit分子对象。isomericSmiles&#xff1a;bool类型&#xff0c;是否生成同分异构体SMILES&#xff0c;默认为…

培训班出身的同学简历怎么做?面试要注意哪些?来自资深大厂HR的忠告

目录 1 不少培训班候选人的简历中&#xff0c;缺乏足够的商业项目年限 2 直接描述培训班学习经历会带来的负面影响 3 大龄转行Vs年轻的初级程序员&#xff0c;公司一般会如何选择&#xff1f; 4 经过培训班突击后&#xff0c;可以先面试小公司 5 面试官怎么面试有培训班经历…

安卓开发到底是做什么的

前言 在某平台看到了这样一个问题&#xff1a; 要知道&#xff0c;安卓开发是当前软件行业中的一个热门方向&#xff0c;它涉及到使用 Java 或 Kotlin 语言开发应用程序&#xff0c;运行在安卓操作系统上的手机、平板电脑、电视等设备上。在过去的几年中&#xff0c;随着智能…

追溯ChatGPT

ChatGPT 国内趋势 在国际学术界看来&#xff0c;ChatGPT / GPT-3.5 是一种划时代的产物 它与之前常见的语言模型 (Bert/ Bart/ T5) 的区别&#xff0c;几乎是导弹与弓箭的区别&#xff0c;一定要引起最高程度的重视 国际上的主流学术机构 (如斯坦福大学&#xff0c;伯克利加…