从零开始实现python人脸识别(四) 摄像头/视频人脸检测

视频检测的原理是: 循环读取视频中的每一帧图片, 并将图片用图片检测的方式进行人脸检测

image-20220223103055672

一. 打开/关闭摄像头

# 打开摄像头
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()

image-20220223103055672

六. rtmp视频直播/远程摄像头人脸检测

很多时候,我们需要网络进行远距离推流, 比如视频直播, 或者摄像头离主机很远时, 于是就有rtmp协议的网络视频流

这时, 我们只需要把其地址传入VideoCapture函数即可, 由于手中没有直播源,和远程摄像头, 就不尝试了

©本文首发于 菁英编程爱好者, 转载请注明出处.
菁英编程爱好者 » 从零开始实现python人脸识别(四) 摄像头/视频人脸检测

发表评论

提供最优质的资源集合

立即查看 了解详情