You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:26:15