實(shí)現(xiàn)效果
windows平臺筆記本攝像頭視頻采集、人臉識別,識別后將視頻推流到RTMP流媒體服務(wù)器,在任意客戶端可以進(jìn)行RTMP拉流播放。
效果如圖:
使用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,播放即可。
狗頭是自己加的:)。
視頻采集+人臉檢測+RTMP推流
將上面的兩個例子組合一下,即可實(shí)現(xiàn)。
人生苦短,我用Python,直接上代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-524161.html
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)!