从零开始实现python人脸识别(四) 摄像头/视频人脸检测
视频检测的原理是: 循环读取视频中的每一帧图片, 并将图片用图片检测的方式进行人脸检测
一. 打开/关闭摄像头
# 打开摄像头
cam = cv2.VideoCapture(0)
# 关闭摄像头
cam.release()
# 摄像头是否开启
print(cam.isOpened())
其中VideoCapture(0)中的0代表默认摄像头
二. 摄像头检测人脸
import cv2
# 人脸检测函数
def face_detect(img):
# 转为灰度图片
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载人脸识别过滤器
face_detection = cv2.CascadeClassifier(r"haarcascade_frontalface_alt2.xml")
# 监测人脸
face = face_detection.detectMultiScale(
gray_img, 1.1, 2, 0, (200, 200), (2000, 2000))
# 打印结果
print(face)
# 绘制矩形
for x, y, w, h in face:
cv2.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=3)
# 显示图片
cv2.imshow("img_title", img)
# 打开摄像头
cam = cv2.VideoCapture(0)
# 循环检测摄像头
while True:
print(cam.isOpened())
is_playing, frame = cam.read() # 循环读取摄像头
if not is_playing:
break
face_detect(frame)
if cv2.waitKey(1) == ord("q"):
break
# 关闭摄像头
cam.release()
三. 打开/关闭视频
打开视频和打开摄像头其实是一个方法, 只不过是往VideoCapture
里传入了视频地址
# 打开视频
my_video = cv2.VideoCapture(r"img\我好像在哪见过你.mp4")
# 关闭视频
my_video.release()
# 读取视频帧率
fps = my_video.get(cv2.CAP_PROP_FPS)
# 从视频中获取第2帧的图像
my_video.set(cv2.CAP_PROP_POS_FRAMES, 2)
四. 循环检测视频人脸
import cv2
# 人脸检测函数
def face_detect(img):
# 转为灰度图片
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载人脸识别过滤器
face_detection = cv2.CascadeClassifier(r"haarcascade_frontalface_alt2.xml")
# 监测人脸
face = face_detection.detectMultiScale(
gray_img, 1.1, 2, 0, (300, 300), (2000, 2000))
# 打印结果
print(face)
# 绘制矩形
for x, y, w, h in face:
cv2.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=3)
# 显示图片
cv2.imshow("img_title", img)
# 打开视频
my_video = cv2.VideoCapture(r"img\我好像在哪见过你.mp4")
# 循环检测视频
while True:
is_playing, frame = my_video.read() # 循环读取视频
if not is_playing:
break
face_detect(frame)
if cv2.waitKey(1) == ord("q"):
break
# 关闭视频
my_video.release()
单人多人都可以检测哦
五. 网络视频人脸检测
如果能获取到网络视频源文件, 其实和检测本地视频是一样的, 我试了一下时光网是可以的
但是现在各大在线视频网站都在深耕 私有视频格式, 私有传输协议, 以及视频加密技术, 随意解析下载的时代一去不返了, 检测网络视频要从另一个思路出发了, 这个以后再开发, 不管如何还是把老方法先记录在这里
import cv2
# 人脸检测函数
def face_detect(img):
# 转为灰度图片
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载人脸识别过滤器
face_detection = cv2.CascadeClassifier(
r"haarcascade_frontalface_alt.xml")
# 监测人脸
face = face_detection.detectMultiScale(
gray_img, 1.1, 4, 0, (100, 100), (2000, 2000))
# 打印结果
print(face)
# 绘制矩形
for x, y, w, h in face:
cv2.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=3)
# 显示图片
cv2.imshow("img_title", img)
# 打开视频
my_video = cv2.VideoCapture(
r"https://vfx.mtime.cn/Video/2019/02/20/mp4/190220104731967493.mp4")
fps = my_video.get(cv2.CAP_PROP_FPS)
print(fps)
# 循环检测视频
while True:
is_playing, frame = my_video.read() # 循环读取视频
if not is_playing:
break
face_detect(frame)
input_key = cv2.waitKey(10)
if input_key == ord("q"):
break
# 关闭视频
my_video.release()
cv2.destroyAllWindows()
六. rtmp视频直播/远程摄像头人脸检测
很多时候,我们需要网络进行远距离推流, 比如视频直播, 或者摄像头离主机很远时, 于是就有rtmp协议的网络视频流
这时, 我们只需要把其地址传入VideoCapture
函数即可, 由于手中没有直播源,和远程摄像头, 就不尝试了