OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)

这篇具有很好参考价值的文章主要介绍了OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果

windows平台笔记本摄像头视频采集、人脸识别,识别后将视频推流到RTMP流媒体服务器,在任意客户端可以进行RTMP拉流播放。

效果如图:
python opencv 推流,图像处理,ffmpeg,python,opencv

使用VLC播放器进行拉流。

准备工作

需要先安装OpenCV的python包以及FFmpeg。

对于ffmpeg有两种调用方式,但这两种方式都需要先安装ffmpeg,调用的具体区别是:

  • 使用管道通信的方式,调用FFmpeg可执行文件,通过管道写入视频帧数据,交给FFmpeg编码、推流;
  • 也可以安装ffmpeg-python包,这个包封装了对FFmpeg的调用,最终也是通过管道通信实现数据传递的。

推荐直接用第一种方式。

人脸检测实现

首先要区分说明一下,人脸检测与人脸识别是不一样的。检测只是将图像中的人脸框出或作其他突出显示,人脸识别则需要预先将人脸录入,当图像、视频中出现人脸时,对人脸进行检测,再将得到数据与录入的进行匹配,识别判断,人脸考勤机是人脸识别最常见的应用。

因此,人脸识别要比人脸检测更复杂一些。

利用Python opencv的Haar特征检测,可以很方便实现人脸检测的效果。

示例代码:

import cv2

# 人脸检测器模型文件路径
# face_cascade = cv2.CascadeClassifier('C:/Users/ACER/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml') #pip安装opencv包路径下的模型文件
face_cascade = cv2.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取一帧
    ret, frame = cap.read()

    # 将图片转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)

    # 在检测到的每张人脸周围画一个矩形
    for (x,y,w,h) in faces:
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)

    # 显示帧
    cv2.imshow('frame',frame)

    # 如果按下q键,退出循环
    if cv2.waitKey(1) & 0xFF == 27:
        print("Press Esc, to exit.")
        break

# 释放摄像头
cap.release()

# 关闭所有窗口
cv2.destroyAllWindows()

代码流程:

  • 构建一个Haar级联分类器,调用CascadeClassifier即可,传入的参数为人脸检测器模型文件路径:

    cv2.CascadeClassifier('C:/Users/ACER/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
    cv2.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
    

    可以使用pip安装opencv包的路径下的模型文件,也可以使用自己安装的opencv中的模型文件,效果相同。

    'C:/Users/ACER/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml'是使用pip安装opencv-python时下载的;

    'D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml'则是我自己安装opencv库时下载的。

  • 调用VideoCapture采集视频帧,并将其转为灰度图,传递给人脸级联分类器face_cascade;

  • 得到分类后的矩形坐标后,在原有数据上绘制出矩形框,即可将人脸框出,调用imshow方法将处理后的图像显示。

调用FFmpeg实现RTMP推流

前面说了有两种方式。

1、直接调用ffmpeg命令

实现思路:调用FFmpeg,在后台开一个子进程,视频帧数据通过这个子进程标准输入写入,数据经过子进程处理后推流到RTMP服务器。

ffmpeg安装后需要添加到windows环境变量,确保在命令行可以直接调用。

import cv2
import subprocess
# 打开摄像头
cap = cv2.VideoCapture(0)

# 设置摄像头分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 2)

fps = cap.get(cv2.CAP_PROP_FPS)
print("fps:", fps)
# 设置缓冲区大小为2

# 定义视频编码器
fourcc = cv2.VideoWriter_fourcc(*'X264')

# 创建FFmpeg命令行参数
ffmpeg_cmd = ['ffmpeg',
              '-y',  # 覆盖已存在的文件
              '-f', 'rawvideo',
              '-pixel_format', 'bgr24',
              '-video_size', '640x480',
              '-i', '-',  # 从标准输入读取数据
              '-c:v', 'libx264', #使用x264编码器
              '-preset', 'ultrafast',
              '-tune', 'zerolatency',#零延迟
              '-pix_fmt', 'yuv420p',
              '-f', 'flv',
              'rtmp://120.79.54.142:1935/live/cv_demo']

# 启动FFmpeg进程
ffmepg_process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE)
# 开始采集和推流
while True:
    # 采集一帧图像
    ret, frame = cap.read()
    if ret:
        # 通过FFmpeg编码和推流
        ffmepg_process.stdin.write(frame.tobytes())

# 停止FFmpeg进程并释放资源
ffmepg_process.stdin.close()
ffmepg_process.wait()
cap.release()

2、使用ffmpeg-python包

chatgpt给出的示例,存在一些小问题,没有使用这种方式,暂未深究。

import cv2
import ffmpeg

# 打开本地摄像头
cap = cv2.VideoCapture(0)

# 设置编码参数
output_size = (640, 480)
fps = 30
codec = "libx264"
bitrate = "1000k"

# 设置输出流
rtmp_url = "rtmp://your-rtmp-server-url.com/live/stream_key"
out = ffmpeg.output(
    ffmpeg.input('pipe:', format='rawvideo', pix_fmt='bgr24', s='{}x{}'.format(*output_size), r=fps),
    ffmpeg.format('flv'),
    rtmp_url,
    vcodec=codec,
    b=bitrate
)

# 打开输出流
process = out.run_async(pipe_stdin=True)

# 循环读取每一帧图像,并将其写入输出流
while True:
    ret, frame = cap.read()
    if not ret:
        break
    process.stdin.write(frame.tobytes())

# 关闭输入流和输出流
cap.release()
process.stdin.close()
process.wait()

拉流验证

推流成功后,可以使用VLC播放器拉流验证,使用网络串流功能,输入推流的url,播放即可。

python opencv 推流,图像处理,ffmpeg,python,opencv

狗头是自己加的:)。

视频采集+人脸检测+RTMP推流

将上面的两个例子组合一下,即可实现。

人生苦短,我用Python,直接上代码:

import cv2
import ffmpeg
import subprocess

# 人脸检测器
class FaceDetector:
    def __init__(self, module_file):
        self.module_file = module_file
        self.face_cascade = cv2.CascadeClassifier(self.module_file)

    def detectFace(self, gray_img):
        face_rect = self.face_cascade.detectMultiScale(gray_img, 1.3, 5)
        return face_rect
# 推流器
class StreamPusher:
    def __init__(self, rtmp_url):
        # 创建FFmpeg命令行参数
        ffmpeg_cmd = ['ffmpeg',
                      '-y',  # 覆盖已存在的文件
                      '-f', 'rawvideo',
                      '-pixel_format', 'bgr24',
                      '-video_size', '640x480',
                      '-i', '-',  # 从标准输入读取数据
                      '-c:v', 'libx264',
                      '-preset', 'ultrafast',
                      '-tune', 'zerolatency',
                      '-pix_fmt', 'yuv420p',
                      '-f', 'flv',
                      rtmp_url]
        print('ffmpeg_cmd:', ffmpeg_cmd)
        # 启动 ffmpeg
        self.ffmepg_process = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE)

    def streamPush(self, frame):
        self.ffmepg_process.stdin.write(frame.tobytes())

# 人脸检测器模型文件路径
module_file = 'D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml'
rtmp_server = 'rtmp://120.79.54.142:1935/live/cv_demo'

# program entry
if __name__ == '__main__':
    dectector = FaceDetector(module_file)
    pusher = StreamPusher(rtmp_server)
    # 打开摄像头
    cap = cv2.VideoCapture(0)
    while True:
        # 读取一帧
        ret, frame = cap.read()
        # 将图片转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 检测人脸
        faces = dectector.detectFace(gray)
        # 在检测到的每张人脸周围画一个矩形
        for (x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
        # 显示帧
        cv2.imshow('frame',frame)
        # 如果按下Esc键,退出循环
        if cv2.waitKey(1) & 0xFF == 27:
            print("Press Esc, to exit.")
            break
        pusher.streamPush(frame)
    # 释放摄像头
    cap.release()
    # 关闭所有窗口
    cv2.destroyAllWindows()

总结

使用python可以快速实现功能,但延迟还是有点高,画面也不太流畅,还有优化空间。有空还是用CPP实现一下吧。文章来源地址https://www.toymoban.com/news/detail-524161.html

到了这里,关于OpenCV+FFmpeg 实现人脸检测Rtmp直播推流(Python快速实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python进行ffmpeg推流和拉流rtsp、rtmp + AI模型推理

    流媒体协议,英文学名Streaming Protocol,用一句人话来解释:流媒体协议是一种用于通过 Web 传递多媒体的协议。 传统视频流协议:RTMP和RTSP ,其中 RTMP 是基于 TCP 开发的,那么 RTSP 使用到了 UDP 。 底层协议:TCP 视频编解码器: H.264 音频编解码器:AAC 延迟:3 - 30 秒 RTMP 的最大

    2024年02月06日
    浏览(42)
  • RTMP直播推流(一)视频推流

    关于cmakeList的配置,这里就直接给出代码:  在视频推流中,java层主要实现初始化、设置画布、转摄像头、开始直播和停止直播操作: MainActivity: LivePush代码: VideoChannel: 可以使用debug看一看操作的流程 下面进行jni层的开发: 首先要初始化设置: 初始化编码器: setVideo

    2024年02月02日
    浏览(43)
  • 用EasyAVFilter(ffmpeg.dll)实现RTSP流转RTMP推流的demo示例Linux版

    ffmpeg.exe做拉流转推流不靠谱,不能产品化;avcodec、avfilter做拉流转推流门槛又太高;用EasyAVFilter将ffmpeg.c改成ffmpeg.dll,用起来刚刚好,直接上示例代码: Demo下载地址:https://www.easydarwin.org/tools/153.html

    2024年02月21日
    浏览(53)
  • RTSP 和 RTMP通过ffmpeg实现将本地摄像头推流到RTSP服务器

    一、流媒体:RTSP 和RTMP 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用户设备向视频流平台发送 RTSP 请求 视频流平台返回可以操作的请求列表,比如播放、暂停等 用户设备向视频流平台发送具体的请求,比如播放 视频流平台解析请求并调用指定机制启动视频流处理 由于 RTSP 依

    2024年02月05日
    浏览(54)
  • 树莓派3B+ /+ CSI摄像头 + FFmpeg + SRS 实现直播推流

    手头有一个树莓派3B+ 和一块CSI摄像头,想要实现一个推拉流直播的效果。 所需材料: 开发板(我用的是树莓派3B+)、CIS摄像头、云服务器(用来搭建SRS服务器) 使用树莓派+CSI摄像头来做画面采集,然后使用FFmpeg推流到SRS云服务器上,然后用户可以拉取SRS服务器上的视频流

    2024年01月22日
    浏览(52)
  • RTSP 和 RTMP原理 & 通过ffmpeg实现将本地摄像头推流到RTSP服务器

    0、参考资料 秒懂流媒体协议 RTMP 与 RTSP 什么是RTMP 和 RTSP?它们之间有什么区别? RTSP和RTMP的区别是什么? 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用户设备向视频流平台发送 RTSP 请求 视频流平台返回可以操作的请求列表,比如 播放、暂停 等 用户设备向视频流平台发送具

    2024年02月08日
    浏览(65)
  • 利用FFmpeg实现录屏、直播推流、音频视频格式转换、剪裁等功能

    一、FFmpeg简介。 二、FFmpeg常用参数及命令。 三、FFmpeg在Unity 3D中的使用。 1、FFmpeg 录屏。 2、FFmpeg 推流。 3、FFmpeg 其他功能简述。 对于FFmpeg,其官网上是这样介绍的: FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything th

    2024年02月09日
    浏览(52)
  • 大疆无人机基于RTMP服务推流直播

    流程:配置nginx服务器---打开服务器----配置无人机rtmp地址,将无人机画面推流到服务器上----运行vlc从服务器上拉取视频流播放。 学习视频链接(可借鉴):https://www.youtube.com/watch?v=QNEjTGQL7wc 一、在linux服务器中(ubuntu18.04)下载安装docker容器,docker分为docker engine 和 docker desktop 我

    2024年02月05日
    浏览(84)
  • nginx rtmp http_flv直播推流

    安装配置nginx 配置 [root@localhost conf]# cat nginx.conf|grep -ivE ‘ #| $| #’ [root@localhost conf]# cat flv.conf |grep -vE ‘^$’ 启动 注册服务 测试 - 推流 -----------------end

    2024年02月14日
    浏览(53)
  • 树莓派Python+ffmpeg+opencv实现推流 并 解决报错:BrokenPipeError: [Errno 32] Broken pipe

      最近在用ffmpeg+Python opencv 的方法实现采集摄像头实时视频并完成推流。实现思路是:cv2先获取摄像头视频数据,然后建立一个subprocess.popen管道去推流,然后将视频帧处理完后写入管道中完成图像处理并推流的工作。在windows下调试可以正常实现,代码如下(这个网上很多

    2024年02月15日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包