yolov8实战第五天——yolov8+ffmpg实时视频流检测并进行实时推流——(推流,保姆教学)

yolov8实战第一天——yolov8部署并训练自己的数据集(保姆式教程)_yolov8训练自己的数据集-CSDN博客

yolov8实战第三天——yolov8TensorRT部署(python推理)(保姆教学)-CSDN博客

今天,我们继续yolov8的实战,实时视频流检测,可以将本地视频或视频流,进行yolov8检测后的结果,推成rtsp流,可以实时看到检测结果。

YOLOv8是YOLO目标检测算法的一个变种。它在YOLOv4的基础上进行了一些改进,如使用更大的图像尺寸、更深的网络结构、更多的训练数据等,从而获得更好的检测精度和更快的检测速度。

实时视频流目标检测是一种非常有用的应用场景。例如,在视频监控系统中,我们需要对视频流进行实时分析和检测,以便及时发现异常事件和行为。另外,实时视频流目标检测也可以用于自动驾驶、无人机等领域。

要将YOLOv8和FFmpeg结合起来进行实时视频流目标检测,通常的做法是使用FFmpeg将视频流转换为图像帧,并将这些图像帧输入到YOLOv8模型中进行目标检测。具体步骤如下:

  1. 定义视频流地址,并使用FFmpeg启动一个进程来读取视频流,并将其转换为图像帧。
  2. 加载YOLOv8模型,并设置相关参数,如输入图像尺寸、阈值等。
  3. 循环读取每一帧图像,并将其输入到YOLOv8模型中进行目标检测。
  4. 处理检测结果,如筛选出置信度高的检测框、绘制边界框等。
  5. 可以将处理后的图像帧保存到视频文件中,也可以直接在屏幕上显示图像帧(使用OpenCV等库)。

实施这个项目的意义在于,它可以帮助我们快速地对实时视频流进行目标检测,并及时发现异常事件和行为。这对于一些需要实时监控和分析的领域非常有用,如安防、交通、医疗等。另外,这个项目也可以为自动驾驶、无人机等领域的研究提供基础支持。

一、下载ffmpg

下载 FFmpeg

E:\2345Downloads\ffmpeg-2023-12-18-git-be8a4f80b9-essentials_build\bin

ffmpeg -version

 二、(可选)搭建EasyDarwin开源流媒体服务器

第二章和第三章二选一 。

测试:

新建一个 demo.bat 的文件,添加内容为:ffmpeg -f gdigrab -i desktop -vcodec mpeg4 -acodec libmp3ame -r 30 -vf scale=1028*720 -f rtsp rtsp://localhost:554/desktopVideo

 http://localhost:10008

 vlc打开:

rtsp://localhost:554/desktopVideo

在cmd中运行 ffplay rtsp://localhost/desktopVideo 进行拉流。 

本地视频推流:

E:\yolov8>ffmpeg -re -i "E:/yolov8/视频/test.mp4" -rtsp_transport udp -vcodec h264 -f rtsp rtsp://localhost/testPushStream

开始推流 

访问: 

http://localhost:10008/

 

vlc打开:

rtsp://localhost:554/testPushStream

命令行推流完成。

三、(可选)Nginx搭建rtmp流媒体服务器

windows版nginx下载地址:Index of /download/

在conf文件夹下复制一份nginx-win.conf,命名为mynginx.conf

修改配置文件:mynginx.conf

改一下默认的http服务器端口,默认的是80端口,我改成了10080:

 

在本配置文件末尾添加rtmp的配置:

rtmp {
    server {
        listen 1935;#监听端口,若被占用,可以更改
        chunk_size 4096;#上传flv文件块儿的大小
        application live { #创建一个叫live的应用
             live on;#开启live的应用
             allow publish 127.0.0.1;
             allow play all;
        }
    }
}

这个配置完之后,推流地址就是:

rtmp://127.0.0.1:1935/live/xxxxxx

,其中xxxxxx可自定义名称。

1.使用命令行启动nginx:

nginx.exe -c conf/mynginx.conf

2. 使用ffmpeg推流:

ffmpeg.exe -re -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live/stream

 

3.ffmpeg拉流 

ffplay.exe rtmp://127.0.0.1:1935/live/stream

如果需要停止nginx服务器,直接杀进程就可以:

 

四、yolov8推理代码推流

我这个代码使用的是nginx流媒体服务器。

1.先将服务打开:

2.运行检测推流代码: 

import cv2
import subprocess
from ultralytics import YOLO

# 载入 YOLOv8 模型
model = YOLO('model/yolov8n.pt')

# 获取视频内容
cap = cv2.VideoCapture("视频/test.mp4")

# 获取原视频的宽度和高度
original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 设置 FFmpeg 子进程,用于推流
rtmp_url = 'rtmp://127.0.0.1:1935/live/stream'  # 修改为您的 NGINX RTMP 服务器地址
command = ['ffmpeg',
           '-y',
           '-f', 'rawvideo',
           '-vcodec', 'rawvideo',
           '-pix_fmt', 'bgr24',
           '-s', "{}x{}".format(original_width, original_height),
           '-r', str(fps),
           '-i', '-',
           '-c:v', 'libx264',
           '-pix_fmt', 'yuv420p',
           '-preset', 'ultrafast',
           '-f', 'flv',
           rtmp_url]

# 启动 FFmpeg 进程
proc = subprocess.Popen(command, stdin=subprocess.PIPE)

# 循环遍历视频帧
while cap.isOpened():
    # 从视频中读取一帧
    success, frame = cap.read()

    if success:
        # 对帧运行 YOLOv8 推理
        results = model(frame)

        # 在帧上可视化结果
        annotated_frame = results[0].plot()

        # 将处理后的帧写入 FFmpeg 进程
        proc.stdin.write(annotated_frame.tobytes())

        # 显示带有标注的帧
        cv2.imshow("YOLOv8 推理", annotated_frame)

        # 如果按下 'q' 键,则中断循环
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

# 释放视频捕获对象
cap.release()

# 关闭 FFmpeg 进程
proc.stdin.close()
proc.wait()

# 关闭显示窗口
cv2.destroyAllWindows()

3.vlc 打开:

rtmp://127.0.0.1:1935/live/stream

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

比例阀放大器控制阀类型

控制各种不带电气位移反馈的单电磁铁比例方向阀、比例压力阀、比例流量阀、比例减压阀、比例节流阀、比例插装阀的BEUEC比例放大器,供电24VDC,输入指令、输出电流、颤振频率、斜坡时间等可现场设置,适用不同阀易匹配,带参考电压输…

openwrt使用docker部署adguard home

docker创建macvlan,目的使adguard home具备宿主机同网段IP docker network create -d macvlan --subnet192.168.88.0/24 --gateway192.168.88.254 -o parentbr-lan bridge-host(虚拟网卡名字)拉取adguard home镜像 docker pull adguard/adguardhome:la…

记一次:职业规划与心灵成长

前言:csdn组织了2023年的年度征文,为了响应号召(嘘~其实为了那个铭牌),加上这么多年了也该总结一下了,就写了这么一篇(公司正好让写年终总结,巧了么这不是) 一、感谢部分…

对图片进行数据增强(基于pytorch)

背景 在进行机器学习的任务中,我们的训练数据往往是有限的,在有限的数据集上获得较好的模型训练结果,我们不仅要在模型结构上下功夫,另一方面也需要对数据集进行数据增强 图片数据增强 图像数据增强是一种在训练机器学习和深度学…

CentOS 8 基于官方源码制作openssh 9.6 rpm包(含ssh-copy-id、openssl) —— 筑梦之路

CentOS 8 制作openssh9.6 rpm(含ssh-copy-id命令)包 —— 筑梦之路_centos8 rpmbuild -ba openssh.spec 9.6-CSDN博客 CentOS 8 制作openssh9.0/9.2/9.3 rpm包——筑梦之路_centos8 openssl rpm包-CSDN博客 效果截图: 和使用官方默认的spec文件制作的区别&#xff…

Redis命令---List篇

目录 1.Redis Lindex 命令 - 通过索引获取列表中的元素简介语法可用版本: > 1.0.0返回值: 列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 nil 。 示例 2.Redis Rpush 命令 - 在列表中添加一个或多个值简介语法可用版本: > 1.0.0返…

springboot社区养老服务系统设计与实现

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1 研究背景 当…

记一次 .NET 某药厂业务系统 CPU爆高分析

一:背景 1. 讲故事 前段时间有位朋友找到我,说他们的程序出现了CPU爆高,让我帮忙看下怎么回事?这种问题好的办法就是抓个dump丢给我,推荐的工具就是用 procdump 自动化抓捕。 二:Windbg 分析 1. CPU 真…

drf知识--11

补充 # 研究simple-jwt提供的Token类: 1、RefreshToken:生成refresh token的类 2、AccessToken:生成refresh token的类 3、Token:他们俩的父类 4、str(RefreshToken的对象)---得到字符串 refresh token,Token类写了 …

【小白专用】PHP识别是电脑或手机访问网站

现在通过手机访问网站越来越流行了,如果我们希望统计一下网站通过pc,手机移动端的各自访问量的情况,或者需要为手机移动端做一些特别的处理的话,那么我们就需要对访问网站的用户的客户端做一下鉴别了,下面这个实例就是…

vue2 消息弹框

父页面 <template><div style"margin-top: 20px"><div class"nav-style msg-style"><el-badge :value"value" :max"99" class"num" v-if"value > 0"><i class"el-icon-bell&…

关于开关量信号隔离器在水泥厂的应用探讨-安科瑞 蒋静

摘要&#xff1a;在水泥厂生产过程中&#xff0c;需要皮带与提升机进行运输物料&#xff0c;回转下料器进行投放物料。其中涉及大量电动机相关的机械运动&#xff0c;对这些机械运动状态进行检测&#xff0c;可以及时发现问题避免造成事故。针对机械位置检测&#xff0c;通常使…

Redis第四讲——Redis的数据库结构、删除策略及淘汰策略

一、redis中的数据库 redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。db数组的每项都是一个redis.h/redisDb结构&#xff0c;而每个redisDb结构就代表一个数据库。在初始化服务器时&#xff0c;程序会根据服务器状态的dbnum属性来决定应该创建多…

【shell漫步】2 运算符

碎碎念 上一章介绍了各种变量的定义和使用&#xff0c;这次要针对数字和文本这两种基本数据类型进行运算和判断了&#xff0c;shell中的运算包括&#xff1a; 对数字类型 算术运算&#xff08;对数字的 数学 运算&#xff09;关系运算&#xff08;用来做数字的条件判断&…

使用Go语言的HTTP客户端进行并发请求

Go语言是一种高性能、简洁的编程语言&#xff0c;它非常适合用于构建并发密集型的网络应用。在Go中&#xff0c;标准库提供了强大的HTTP客户端和服务器功能&#xff0c;使得并发HTTP请求变得简单而高效。 首先&#xff0c;让我们了解为什么需要并发HTTP请求。在许多应用场景中…

「Verilog学习笔记」任意奇数倍时钟分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule clk_divider#(parameter dividor 5) ( input clk_in,input rst_n,output clk_out );parameter CNT_WIDTH $clog2(dividor - 1) ; reg flag1, f…

「Verilog学习笔记」编写乘法器求解算法表达式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule calculation(input clk,input rst_n,input [3:0] a,input [3:0] b,output [8:0] c);reg [8:0] data1, data2 ; assign c data2 ; always (posed…

基于ssm的订餐管理系统论文

基于JSP的订餐管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的订餐信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的…

微同城本地小程序源码系统:顺风车+二手市场+跑腿功能+信息发布+广告功能 带完整的搭建教程

随着移动互联网的普及&#xff0c;小程序已成为各行业进行线上业务拓展的重要工具。微同城作为一款集顺风车、二手市场、跑腿功能、信息发布和广告功能于一体的本地小程序源码系统&#xff0c;旨在满足现代城市居民的多元化需求&#xff0c;提供一个方便、快捷、实用的服务平台…

Linkage Mapper 工具参数详解——Building Network and Map Linkages

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&#…