如何在Google Colab中为视频添加人脸裁剪显示窗口
实现视频第二窗口显示裁剪人脸的方案
看起来你已经搞定了人脸检测的基础工作,现在就差把裁剪后的人脸整合到视频的第二个窗口里啦!我会帮你修改代码,实现「左侧原视频带人脸框 + 右侧窗口展示所有裁剪人脸」的效果:
核心思路
我们需要完成这几件关键操作:
- 从每一帧中裁剪出检测到的人脸
- 创建一个固定宽度的右侧窗口,把裁剪后的人脸整齐排列进去
- 将原视频帧和人脸窗口拼接成一个完整帧,再写入输出视频
修改后的完整代码
import cv2 import face_recognition import numpy as np # (假设你已经完成了视频初始化,比如下面的代码,根据自己的视频路径调整) # input_video = cv2.VideoCapture("your_uploaded_video.mp4") # fps = input_video.get(cv2.CAP_PROP_FPS) # width = int(input_video.get(cv2.CAP_PROP_FRAME_WIDTH)) # height = int(input_video.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 定义右侧人脸窗口的宽度,可根据需求调整 face_window_width = 300 # 输出视频的尺寸:原视频宽度 + 人脸窗口宽度,高度和原视频一致 output_width = width + face_window_width output_height = height # 初始化视频写入器,注意尺寸要匹配拼接后的帧 fourcc = cv2.VideoWriter_fourcc(*'mp4v') video_writer = cv2.VideoWriter('output_with_face_window.mp4', fourcc, fps, (output_width, output_height)) face_locations = [] count = 1 while True: ret, frame = input_video.read() if not ret: print('Processed all frames') break # 转换为RGB格式用于人脸检测 rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) face_locations = face_recognition.face_locations(rgb_frame, model='cnn') # 1. 在原视频帧上绘制人脸框 for top, right, bottom, left in face_locations: cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # 2. 裁剪所有人脸并统一尺寸 face_crops = [] for top, right, bottom, left in face_locations: # 从原BGR帧中裁剪人脸(无需转回RGB,OpenCV默认用BGR) face_crop = frame[top:bottom, left:right] # 统一缩放到150x150,方便排列 face_crop = cv2.resize(face_crop, (150, 150)) face_crops.append(face_crop) # 创建右侧人脸窗口的空白背景(浅灰色) face_window = np.zeros((output_height, face_window_width, 3), dtype=np.uint8) face_window[:] = (200, 200, 200) # 把裁剪的人脸按每行2个的规则排列到窗口中,垂直居中 if face_crops: rows = (len(face_crops) + 1) // 2 crop_size = 150 start_y = (output_height - rows * crop_size) // 2 for idx, crop in enumerate(face_crops): row = idx // 2 col = idx % 2 y_pos = start_y + row * crop_size x_pos = (face_window_width - 2 * crop_size) // 2 + col * crop_size # 确保人脸不会超出窗口边界 if y_pos + crop_size <= output_height and x_pos + crop_size <= face_window_width: face_window[y_pos:y_pos+crop_size, x_pos:x_pos+crop_size] = crop # 3. 横向拼接原视频帧和人脸窗口 combined_frame = np.hstack((frame, face_window)) # 写入拼接后的完整帧(替换原代码中无效的`video_writer.write(face)`) video_writer.write(combined_frame) if count % 50 == 0: print('Processed', count, 'frames') count += 1 # 释放所有资源 input_video.release() video_writer.release() cv2.destroyAllWindows()
关键修改说明
- 修复原代码错误:原代码中
video_writer.write(face)是无效的(face变量未定义),我们替换为写入拼接后的完整帧 - 人脸窗口设计:新增固定宽度的浅灰色背景窗口,让裁剪的人脸更突出
- 人脸排列优化:统一人脸尺寸后按网格排列,保证视觉整齐
- 适配Colab环境:输出视频可以直接在Colab中预览,如果你需要预览,可以添加这段代码:
from IPython.display import HTML from base64 import b64encode mp4 = open('output_with_face_window.mp4','rb').read() data_url = "data:video/mp4;base64," + b64encode(mp4).decode() HTML(f""" <video width=800 controls> <source src="{data_url}" type="video/mp4"> </video> """)
内容的提问来源于stack exchange,提问作者fadhly Meryam
相关产品推荐
相关产品推荐

