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,有偿悬赏提问。