鲍渔爱好者 2024-04-02 21:07 采纳率: 33.3%
浏览 17
已结题

python3 cv2 视频人脸识别如何快速模糊处理

import cv2
import numpy as np
import subprocess
if __name__ == '__main__':
    video = cv2.VideoCapture('input.mp4')
    
    # 调整视频的播放速度为原来的两倍
    #video.set(cv2.CAP_PROP_FPS, video.get(cv2.CAP_PROP_FPS) * 2)
    
    fps = video.get(cv2.CAP_PROP_FPS)  # 视频的帧率
    width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    #count = video.get(cv2.CAP_PROP_FRAME_COUNT)
    #size = (int(width), int(height))
    print("fps:", fps)
    print("width:", width)
    print("height:", height)
    #print("count:", count)
    #print("size:", size)
    # 视频的本质是逐帧播放
    face_detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('out.avi',fourcc, fps, (width,height))
    #minSize = (100, 100)  # 设置检测窗口的最小尺寸
    #maxSize = (200, 200)  # 设置检测窗口的最大尺寸
    while True:
        retval, image = video.read()  # retval 是bool型的值 读取到最后一帧 变成false
        if not retval:
            print("视频读取完成")
            break
        image = cv2.resize(image, (width, height))
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray,minNeighbors=3)  # 耗费时间的操作  每一张图片你都要遍历
        for x, y, w, h in faces:
            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.rectangle(image, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)    #绘制矩形框
        out.write(image)
        cv2.imshow("playing", image)
        
        #选择适当的cv2.waitKey()时间,如果该值太小,视频会非常快,如果它太大,视频会很慢(这可以用来慢动作显示视频)。 正常情况下,25毫秒即可。
        if cv2.waitKey(25) == ord('q'):
            print("exit")
            break
    video.release()
    out.release()
    #-crf是常量速因子,值范围从0(无损)到51(极低质量),20是一个通用的高质量范围值。-preset用于指定转码的预设,ultrafast速度最快也是最模糊的,veryfast是一个快速转码但质量还不错的选项。音频流使用-c:a copy参数直接复制,不进行重编码
    #调用系统ffmpeg命令
    command = [
        'ffmpeg',
        '-i', 'out.avi',
        '-c:v', 'libx264',
        '-crf', '20',
        '-preset', 'veryfast',
        '-c:a', 'copy',
        'output.mp4'
    ]
    #转换h264格式
    #try:
        #subprocess.run(command)
        #print(f"转码成功: output.mp4")
    #except subprocess.CalledProcessError as e:
    #    print(f"转码失败: {e}")
    
    cv2.destroyAllWindows()
 

这是一个调用python cv2对视频人脸模糊处理的脚本,但是如何进行快速处理,如果一个视频有15分钟,那么处理完生成新的mp4也需要15分钟,能否实现快速处理,本人做java开发的,对python不是很熟,也是在百度找的代码自己做了一些修改,不知道是否有相关的api,在网上没查到.
请教大lao对我这个人脸模糊处理的代码进行优化(目前马赛克范围不够大,还要提高下模糊度和人脸识别跟踪速度)和实现快速处理功能
现开发环境python3.10,opencv 4.9,有偿悬赏提问。

  • 写回答

14条回答 默认 最新

  • 檀越@新空间 2024-04-02 21:07
    关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    针对你的需求,可以采用以下方法来优化和加快视频人脸模糊处理:

    1. 通过调整参数来提高人脸识别的速度:在face_detector.detectMultiScale()方法中,可以调整minNeighbors参数以减少人脸检测的误报率和漏报率。通过适当调整此参数可以加快人脸识别的速度。

    2. 减少人脸处理的频率:不需要对每一帧都进行人脸检测和模糊处理,可以设置一个间隔帧数,在间隔帧中进行人脸处理,可以大幅度减少处理的帧数,从而提高处理速度。

    3. 减少模糊处理的区域:如果你只需要对人脸进行模糊处理,可以利用人脸检测结果来提取人脸区域,然后对该区域进行处理,而不是对整个图像进行处理。这样可以减少处理的像素数量,从而提高处理速度。

    4. 优化人脸模糊处理算法:可以尝试使用其他更高效的模糊处理算法,比如高斯模糊或均值模糊。这些算法在模糊效果相近的情况下,可以提供更快的处理速度。

    5. 利用多线程或多进程并行处理:将视频分割成多个均匀的小片段,然后使用多个线程或多个进程来并行处理这些片段,可以提高处理速度。可以使用Python的threadingmultiprocessing模块来实现并行处理。

    下面是对你代码的一些优化建议和修改示例:

    import cv2
    import numpy as np
    import subprocess
    from multiprocessing import Pool
    
    def process_frame(frame):
        # 在这里进行每帧的处理
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(gray, minNeighbors=3)
        
        for x, y, w, h in faces:
            face = frame[y:y + h, x:x + w]
            face = cv2.resize(face, (w // 10, h // 10))
            face = cv2.resize(face, (w, h), interpolation=cv2.INTER_NEAREST)
            frame[y:y + h, x:x + w] = face
        
        return frame
    
    if __name__ == '__main__':
        video = cv2.VideoCapture('input.mp4')
        fps = video.get(cv2.CAP_PROP_FPS)
        width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
        height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
        face_detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
        out = cv2.VideoWriter('out.avi', cv2.VideoWriter_fourcc(*'XVID'), fps, (width, height))
    
        with Pool() as p:
            while True:
                retval, frame = video.read()
                if not retval:
                    print("视频读取完成")
                    break
    
                frame = cv2.resize(frame, (width, height))
                out_frame = p.map(process_frame, [frame])[0]
                cv2.imshow("playing", out_frame)
                out.write(out_frame)
    
                if cv2.waitKey(25) == ord('q'):
                    print("exit")
                    break
    
        video.release()
        out.release()
        cv2.destroyAllWindows()
    

    请注意,这个示例中使用了multiprocessing.Pool来实现多进程并行处理,可能需要根据你的具体环境进行调整。另外,还对模糊处理的代码进行了一些优化,可以根据需求进行调整。

    此外,如果需要进一步提高处理速度,可以考虑使用GPU加速,例如使用CUDA进行人脸识别和模糊处理。这需要安装相应的库和配置GPU环境。每个环境情况不同,可以在网上搜索相关的教程进行配置。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月3日
  • 创建了问题 4月2日