国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV+FFmpeg 實(shí)現(xiàn)人臉檢測Rtmp直播推流(Python快速實(shí)現(xiàn))

這篇具有很好參考價值的文章主要介紹了OpenCV+FFmpeg 實(shí)現(xiàn)人臉檢測Rtmp直播推流(Python快速實(shí)現(xiàn))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

實(shí)現(xiàn)效果

windows平臺筆記本攝像頭視頻采集、人臉識別,識別后將視頻推流到RTMP流媒體服務(wù)器,在任意客戶端可以進(jìn)行RTMP拉流播放。

效果如圖:
python opencv 推流,圖像處理,ffmpeg,python,opencv

使用VLC播放器進(jìn)行拉流。

準(zhǔn)備工作

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

對于ffmpeg有兩種調(diào)用方式,但這兩種方式都需要先安裝ffmpeg,調(diào)用的具體區(qū)別是:

  • 使用管道通信的方式,調(diào)用FFmpeg可執(zhí)行文件,通過管道寫入視頻幀數(shù)據(jù),交給FFmpeg編碼、推流;
  • 也可以安裝ffmpeg-python包,這個包封裝了對FFmpeg的調(diào)用,最終也是通過管道通信實(shí)現(xiàn)數(shù)據(jù)傳遞的。

推薦直接用第一種方式。

人臉檢測實(shí)現(xiàn)

首先要區(qū)分說明一下,人臉檢測與人臉識別是不一樣的。檢測只是將圖像中的人臉框出或作其他突出顯示,人臉識別則需要預(yù)先將人臉錄入,當(dāng)圖像、視頻中出現(xiàn)人臉時,對人臉進(jìn)行檢測,再將得到數(shù)據(jù)與錄入的進(jìn)行匹配,識別判斷,人臉考勤機(jī)是人臉識別最常見的應(yīng)用。

因此,人臉識別要比人臉檢測更復(fù)雜一些。

利用Python opencv的Haar特征檢測,可以很方便實(shí)現(xiàn)人臉檢測的效果。

示例代碼:

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()

    # 將圖片轉(zhuǎn)換為灰度圖像
    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鍵,退出循環(huán)
    if cv2.waitKey(1) & 0xFF == 27:
        print("Press Esc, to exit.")
        break

# 釋放攝像頭
cap.release()

# 關(guān)閉所有窗口
cv2.destroyAllWindows()

代碼流程:

  • 構(gòu)建一個Haar級聯(lián)分類器,調(diào)用CascadeClassifier即可,傳入的參數(shù)為人臉檢測器模型文件路徑:

    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庫時下載的。

  • 調(diào)用VideoCapture采集視頻幀,并將其轉(zhuǎn)為灰度圖,傳遞給人臉級聯(lián)分類器face_cascade;

  • 得到分類后的矩形坐標(biāo)后,在原有數(shù)據(jù)上繪制出矩形框,即可將人臉框出,調(diào)用imshow方法將處理后的圖像顯示。

調(diào)用FFmpeg實(shí)現(xiàn)RTMP推流

前面說了有兩種方式。

1、直接調(diào)用ffmpeg命令

實(shí)現(xiàn)思路:調(diào)用FFmpeg,在后臺開一個子進(jìn)程,視頻幀數(shù)據(jù)通過這個子進(jìn)程標(biāo)準(zhǔn)輸入寫入,數(shù)據(jù)經(jīng)過子進(jìn)程處理后推流到RTMP服務(wù)器。

ffmpeg安裝后需要添加到windows環(huán)境變量,確保在命令行可以直接調(diào)用。

import cv2
import subprocess
# 打開攝像頭
cap = cv2.VideoCapture(0)

# 設(shè)置攝像頭分辨率
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)
# 設(shè)置緩沖區(qū)大小為2

# 定義視頻編碼器
fourcc = cv2.VideoWriter_fourcc(*'X264')

# 創(chuàng)建FFmpeg命令行參數(shù)
ffmpeg_cmd = ['ffmpeg',
              '-y',  # 覆蓋已存在的文件
              '-f', 'rawvideo',
              '-pixel_format', 'bgr24',
              '-video_size', '640x480',
              '-i', '-',  # 從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)
              '-c:v', 'libx264', #使用x264編碼器
              '-preset', 'ultrafast',
              '-tune', 'zerolatency',#零延遲
              '-pix_fmt', 'yuv420p',
              '-f', 'flv',
              'rtmp://120.79.54.142:1935/live/cv_demo']

# 啟動FFmpeg進(jìn)程
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進(jìn)程并釋放資源
ffmepg_process.stdin.close()
ffmepg_process.wait()
cap.release()

2、使用ffmpeg-python包

chatgpt給出的示例,存在一些小問題,沒有使用這種方式,暫未深究。

import cv2
import ffmpeg

# 打開本地?cái)z像頭
cap = cv2.VideoCapture(0)

# 設(shè)置編碼參數(shù)
output_size = (640, 480)
fps = 30
codec = "libx264"
bitrate = "1000k"

# 設(shè)置輸出流
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)

# 循環(huán)讀取每一幀圖像,并將其寫入輸出流
while True:
    ret, frame = cap.read()
    if not ret:
        break
    process.stdin.write(frame.tobytes())

# 關(guān)閉輸入流和輸出流
cap.release()
process.stdin.close()
process.wait()

拉流驗(yàn)證

推流成功后,可以使用VLC播放器拉流驗(yàn)證,使用網(wǎng)絡(luò)串流功能,輸入推流的url,播放即可。

python opencv 推流,圖像處理,ffmpeg,python,opencv

狗頭是自己加的:)。

視頻采集+人臉檢測+RTMP推流

將上面的兩個例子組合一下,即可實(shí)現(xiàn)。

人生苦短,我用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):
        # 創(chuàng)建FFmpeg命令行參數(shù)
        ffmpeg_cmd = ['ffmpeg',
                      '-y',  # 覆蓋已存在的文件
                      '-f', 'rawvideo',
                      '-pixel_format', 'bgr24',
                      '-video_size', '640x480',
                      '-i', '-',  # 從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)
                      '-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()
        # 將圖片轉(zhuǎn)換為灰度圖像
        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鍵,退出循環(huán)
        if cv2.waitKey(1) & 0xFF == 27:
            print("Press Esc, to exit.")
            break
        pusher.streamPush(frame)
    # 釋放攝像頭
    cap.release()
    # 關(guān)閉所有窗口
    cv2.destroyAllWindows()

總結(jié)

使用python可以快速實(shí)現(xiàn)功能,但延遲還是有點(diǎn)高,畫面也不太流暢,還有優(yōu)化空間。有空還是用CPP實(shí)現(xiàn)一下吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-524161.html

到了這里,關(guān)于OpenCV+FFmpeg 實(shí)現(xiàn)人臉檢測Rtmp直播推流(Python快速實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp + AI模型推理

    Python進(jìn)行ffmpeg推流和拉流rtsp、rtmp + AI模型推理

    流媒體協(xié)議,英文學(xué)名Streaming Protocol,用一句人話來解釋:流媒體協(xié)議是一種用于通過 Web 傳遞多媒體的協(xié)議。 傳統(tǒng)視頻流協(xié)議:RTMP和RTSP ,其中 RTMP 是基于 TCP 開發(fā)的,那么 RTSP 使用到了 UDP 。 底層協(xié)議:TCP 視頻編解碼器: H.264 音頻編解碼器:AAC 延遲:3 - 30 秒 RTMP 的最大

    2024年02月06日
    瀏覽(27)
  • RTMP直播推流(一)視頻推流

    RTMP直播推流(一)視頻推流

    關(guān)于cmakeList的配置,這里就直接給出代碼: ?在視頻推流中,java層主要實(shí)現(xiàn)初始化、設(shè)置畫布、轉(zhuǎn)攝像頭、開始直播和停止直播操作: MainActivity: LivePush代碼: VideoChannel: 可以使用debug看一看操作的流程 下面進(jìn)行jni層的開發(fā): 首先要初始化設(shè)置: 初始化編碼器: setVideo

    2024年02月02日
    瀏覽(29)
  • 用EasyAVFilter(ffmpeg.dll)實(shí)現(xiàn)RTSP流轉(zhuǎn)RTMP推流的demo示例Linux版

    ffmpeg.exe做拉流轉(zhuǎn)推流不靠譜,不能產(chǎn)品化;avcodec、avfilter做拉流轉(zhuǎn)推流門檻又太高;用EasyAVFilter將ffmpeg.c改成ffmpeg.dll,用起來剛剛好,直接上示例代碼: Demo下載地址:https://www.easydarwin.org/tools/153.html

    2024年02月21日
    瀏覽(30)
  • RTSP 和 RTMP通過ffmpeg實(shí)現(xiàn)將本地?cái)z像頭推流到RTSP服務(wù)器

    RTSP 和 RTMP通過ffmpeg實(shí)現(xiàn)將本地?cái)z像頭推流到RTSP服務(wù)器

    一、流媒體:RTSP 和RTMP 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用戶設(shè)備向視頻流平臺發(fā)送 RTSP 請求 視頻流平臺返回可以操作的請求列表,比如播放、暫停等 用戶設(shè)備向視頻流平臺發(fā)送具體的請求,比如播放 視頻流平臺解析請求并調(diào)用指定機(jī)制啟動視頻流處理 由于 RTSP 依

    2024年02月05日
    瀏覽(25)
  • 樹莓派3B+ /+ CSI攝像頭 + FFmpeg + SRS 實(shí)現(xiàn)直播推流

    樹莓派3B+ /+ CSI攝像頭 + FFmpeg + SRS 實(shí)現(xiàn)直播推流

    手頭有一個樹莓派3B+ 和一塊CSI攝像頭,想要實(shí)現(xiàn)一個推拉流直播的效果。 所需材料: 開發(fā)板(我用的是樹莓派3B+)、CIS攝像頭、云服務(wù)器(用來搭建SRS服務(wù)器) 使用樹莓派+CSI攝像頭來做畫面采集,然后使用FFmpeg推流到SRS云服務(wù)器上,然后用戶可以拉取SRS服務(wù)器上的視頻流

    2024年01月22日
    瀏覽(29)
  • RTSP 和 RTMP原理 & 通過ffmpeg實(shí)現(xiàn)將本地?cái)z像頭推流到RTSP服務(wù)器

    RTSP 和 RTMP原理 & 通過ffmpeg實(shí)現(xiàn)將本地?cái)z像頭推流到RTSP服務(wù)器

    0、參考資料 秒懂流媒體協(xié)議 RTMP 與 RTSP 什么是RTMP 和 RTSP?它們之間有什么區(qū)別? RTSP和RTMP的區(qū)別是什么? 1、RTSP 和 RTMP的工作原理 1)RTSP工作原理 用戶設(shè)備向視頻流平臺發(fā)送 RTSP 請求 視頻流平臺返回可以操作的請求列表,比如 播放、暫停 等 用戶設(shè)備向視頻流平臺發(fā)送具

    2024年02月08日
    瀏覽(26)
  • 利用FFmpeg實(shí)現(xiàn)錄屏、直播推流、音頻視頻格式轉(zhuǎn)換、剪裁等功能

    一、FFmpeg簡介。 二、FFmpeg常用參數(shù)及命令。 三、FFmpeg在Unity 3D中的使用。 1、FFmpeg 錄屏。 2、FFmpeg 推流。 3、FFmpeg 其他功能簡述。 對于FFmpeg,其官網(wǎng)上是這樣介紹的: FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything th

    2024年02月09日
    瀏覽(28)
  • 大疆無人機(jī)基于RTMP服務(wù)推流直播

    大疆無人機(jī)基于RTMP服務(wù)推流直播

    流程:配置nginx服務(wù)器---打開服務(wù)器----配置無人機(jī)rtmp地址,將無人機(jī)畫面推流到服務(wù)器上----運(yùn)行vlc從服務(wù)器上拉取視頻流播放。 學(xué)習(xí)視頻鏈接(可借鑒):https://www.youtube.com/watch?v=QNEjTGQL7wc 一、在linux服務(wù)器中(ubuntu18.04)下載安裝docker容器,docker分為docker engine 和 docker desktop 我

    2024年02月05日
    瀏覽(31)
  • nginx rtmp http_flv直播推流

    安裝配置nginx 配置 [root@localhost conf]# cat nginx.conf|grep -ivE ‘ #| $| #’ [root@localhost conf]# cat flv.conf |grep -vE ‘^$’ 啟動 注冊服務(wù) 測試 - 推流 -----------------end

    2024年02月14日
    瀏覽(28)
  • 樹莓派Python+ffmpeg+opencv實(shí)現(xiàn)推流 并 解決報(bào)錯:BrokenPipeError: [Errno 32] Broken pipe

    樹莓派Python+ffmpeg+opencv實(shí)現(xiàn)推流 并 解決報(bào)錯:BrokenPipeError: [Errno 32] Broken pipe

    ??最近在用ffmpeg+Python opencv 的方法實(shí)現(xiàn)采集攝像頭實(shí)時視頻并完成推流。實(shí)現(xiàn)思路是:cv2先獲取攝像頭視頻數(shù)據(jù),然后建立一個subprocess.popen管道去推流,然后將視頻幀處理完后寫入管道中完成圖像處理并推流的工作。在windows下調(diào)試可以正常實(shí)現(xiàn),代碼如下(這個網(wǎng)上很多

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包