opencv 对视频中的人脸进行马赛克处理及摄像头实时识别

opencv 对视频中的人脸进行马赛克处理及摄像头实时识别

先来了解一下能对视频进行读取的函数videoCaptuure() 内接文件路径

video = cv2.VideoCapture('monkey.mp4')
retval, image = video.read()

对于视频来说就是将一张张图片进行逐帧的替换,当帧数达到一定程度时,人眼便不能分辨出
read()这个函数可以用两个变量来进行接受,
第一个变量是一个bool类型的值,他代表下一帧是否还有图片
第二个就是读取出来的每一张图片

马赛克处理的方式之一

face = face[::10, ::10]         # 将人脸图片 每隔10个像素取出来一次
face = np.repeat(np.repeat(face, 10, axis=0),10,axis=1) # 将像素放10次 在两个方向上

np是导入的numpy包
第一个是对读取出来的人脸图片像素点进行间隔取点位
间隔取到的点 就会有部分信息的丢失
repeat函数的用法 大家可以自己了解
全部代码:

# 视频中的人脸马赛克
import cv2
import numpy as np

if __name__ == '__main__':
    video = cv2.VideoCapture('monkey.mp4')
    fps = video.get(propId=cv2.CAP_PROP_FPS)  # 视频的帧率
    width = video.get(propId=cv2.CAP_PROP_FRAME_WIDTH)
    height = video.get(propId=cv2.CAP_PROP_FRAME_HEIGHT)
    count = video.get(propId=cv2.CAP_PROP_FRAME_COUNT)
    print("fps:", fps)
    print("width:", width)
    print("height:", height)
    print("count:", count)
    # 视频的本质是逐帧播放
    face_detector = cv2.CascadeClassifier('./xml/haarcascade_frontalface_alt.xml')
    while True:
        retval, image = video.read()  # retval 是bool型的值 读取到最后一帧 变成false
        if not retval:
            break
            print("视频读取完成")
        image = cv2.resize(image, (640, 360))
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, minNeighbors=5)  # 耗费时间的操作  每一张土拍你都要遍历
        for x, y, w, h in faces:
            # cv2.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
            face = image[y:y + h, x:x + w]  # face = 人脸图片在整个视频中的范围
            face = face[::10, ::10]  # 将人脸图片 每隔10个像素取出来一次
            face = np.repeat(np.repeat(face, 10, axis=0), 10, axis=1)  # 将像素放10次 在两个方向上
            image[y:y + h, x:x + w] = face[:h, :w]  # 将整个视频中的人脸位置赋值为替换成马赛克的人脸
        cv2.imshow("img", image)
        key = cv2.waitKey(1)
        if key == ord('q'):
            print("exit")
            break
    cv2.destroyAllWindows()
    video.release()

摄像头实时人脸识别

其实对摄像头的处理 也就是对视频进行逐帧的处理
这里用到一个调取摄像头的函数

 cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

0是物理机摄像头,1是网络摄像由或者外接摄像头
注意,一定要先对图片进行灰度处理
代码:

import cv2
import numpy as np

# 摄像头人脸识别
if __name__ == '__main__':
    # cap = cv2.VideoCapture(0)

   
    # img = cv2.imread("./img/wang.jpg")
    while True:
        flag, frame = cap.read()
        face_detector = cv2.CascadeClassifier('./xml/haarcascade_frontalface_alt.xml')
        if not flag:
            break
        gray = cv2.cvtColor(frame, code=cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray)
        for x, y, w, h in faces:
            cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
            # img2 = cv2.resize(img,(w,h))
            # frame[y:y+h,x:x+w] = img2
        cv2.imshow("frame", frame)
        key = cv2.waitKey(1000 // 34)
        if key == ord('q'):
            break

    cv2.destroyAllWindows()
    cap.release()

你可能感兴趣的:(笔记,opencv,音视频,python)