13594780438 jiuyouhui@baidu.ag

游戏动态

  • 首页
  • 游戏动态
  • 手掌旋转的视频特效

手掌旋转的视频特效


2025-12-23 11:29:12

我将为您创建一个手掌旋转的视频特效,使用计算机视觉技术检测手掌并进行动态旋转。

实现思路

1. 使用MediaPipe检测手掌关键点

2. 计算手掌方向和旋转角度

3. 创建旋转动画效果

4. 将特效应用到实时视频流

完整代码

python

import cv2

import numpy as np

import mediapipe as mp

from scipy.spatial.transform import Rotation as R

class PalmRotationEffect:

def __init__(self):

# 初始化MediaPipe Hands

self.mp_hands = mp.solutions.hands

self.hands = self.mp_hands.Hands(

static_image_mode=False,

max_num_hands=1,

min_detection_confidence=0.7,

min_tracking_confidence=0.7

self.mp_drawing = mp.solutions.drawing_utils

def detect_palm_orientation(self, landmarks):

计算手掌方向和旋转角度

# 使用手掌关键点计算方向向量

wrist = landmarks[0] # 手腕

middle_mcp = landmarks[9] # 中指根部

# 计算手掌方向向量

direction_vector = np.array([

middle_mcp.x

  • wrist.x,
  • middle_mcp.y

  • wrist.y,
  • middle_mcp.z

  • wrist.z
  • ] ])

    手掌旋转的视频特效

    # 归一化

    norm = np.linalg.norm(direction_vector)

    if norm > 0:

    direction_vector /= norm

    return direction_vector

    def calculate_rotation_matrix(self, direction_vector, rotation_angle):

    根据手掌方向和附加旋转角度计算旋转矩阵

    # 基础旋转矩阵(基于手掌方向)

    target_dir = np.array([0, -1, 0]) # 目标方向(向上)

    if np.linalg.norm(np.cross(direction_vector, target_dir)) > 1e-6:

    rotation_axis = np.cross(direction_vector, target_dir)

    rotation_axis = rotation_axis / np.linalg.norm(rotation_axis)

    # 计算基础旋转角度

    dot_product = np.dot(direction_vector, target_dir)

    base_angle = np.arccos(np.clip(dot_product, -1.0, 1.0))

    # 添加额外旋转角度

    total_angle = base_angle + np.radians(rotation_angle)

    # 创建旋转对象

    rotation = R.from_rotvec(total_angle * rotation_axis)

    return rotation.as_matrix

    return np.eye(3) # 返回单位矩阵

    def create_palm_mask(self, frame, landmarks):

    创建手掌区域的遮罩

    h, w = frame.shape[:2]

    mask = np.zeros((h, w), dtype=np.uint8)

    # 手掌轮廓点索引(简化版本)

    palm_points = [0, 1, 5, 9, 13, 17, 0]

    points = []

    for idx in palm_points:

    landmark = landmarks[idx]

    x, y = int(landmark.x * w), int(landmark.y * h)

    points.append([x, y])

    # 填充手掌区域

    if len(points) > 2:

    cv2.fillPoly(mask, [np.array(points)], 255)

    return mask

    def apply_rotation_effect(self, frame, landmarks, rotation_angle=0):

    应用旋转特效到检测到的手掌

    h, w = frame.shape[:2]

    # 创建手掌遮罩

    mask = self.create_palm_mask(frame, landmarks)

    # 计算手掌方向

    direction_vector = self.detect_palm_orientation(landmarks)

    # 计算旋转矩阵

    rotation_matrix = self.calculate_rotation_matrix(direction_vector, rotation_angle)

    # 应用旋转到手掌区域

    result_frame = frame.copy

    # 找到手掌边界框

    coords = np.where(mask == 255)

    if len(coords[0]) > 0 and len(coords[1]) > 0:

    y_min, y_max = np.min(coords[0]), np.max(coords[0])

    x_min, x_max = np.min(coords[1]), np.max(coords[1])

    # 提取手掌区域

    palm_region = frame[y_min:y_max+1, x_min:x_max+1].copy

    if palm_region.size > 0:

    # 对区域应用透视变换模拟旋转

    center_x, center_y = (x_min + x_max) // 2, (y_min + y_max) // 2

    # 创建变换矩阵

    scale = 1.2

    angle_rad = np.radians(rotation_angle)

    # 旋转矩阵

    M = cv2.getRotationMatrix2D((palm_region.shape[1]//2, palm_region.shape[0]//2),

    rotation_angle, scale)

    # 应用旋转变换

    rotated_palm = cv2.warpAffine(palm_region, M,

    (palm_region.shape[1], palm_region.shape[0]))

    # 创建旋转后的遮罩

    rotated_mask = cv2.warpAffine(mask[y_min:y_max+1, x_min:x_max+1], M,

    (palm_region.shape[1], palm_region.shape[0]))

    # 将旋转后的手掌合成到原图

    for i in range(rotated_palm.shape[0]):

    for j in range(rotated_palm.shape[1]):

    global_y = y_min + i

  • rotated_palm.shape[0]//2 + palm_region.shape[0]//2
  • global_x = x_min + j

  • rotated_palm.shape[1]//2 + palm_region.shape[1]//2
  • if (0

    rotated_mask[i, j] > 128):

    result_frame[global_y, global_x] = rotated_palm[i, j]

    return result_frame

    def process_frame(self, frame, rotation_angle=0):

    处理单帧图像

    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    results = self.hands.process(rgb_frame)

    if results.multi_hand_landmarkslandmarks:

    for hand_landmarks in results.multi_hand_landmarkslandmarks:

    # 绘制手部关键点

    self.mp_drawing.draw_landmarks(

    marks(

    frame, hand_landmarks, self.mp_hands.HAND_CONNECTIONS)

    # 应用旋转特效

    frame = self.apply_rotation_effect(frame, hand_landmarks.landmark, rotation_angle)

    return frame

    def main:

    effect = PalmRotationEffect

    # 打开摄像头

    cap = cv2.VideoCapture(0)

    if not cap.isOpened:

    print("无法打开摄像头")

    return

    print("按 'q' 退出程序")

    print("按 'r' 重置旋转角度")

    print("移动手掌查看旋转效果")

    rotation_angle = 0

    while True:

    ret, frame = cap.read

    if not ret:

    break

    # 更新旋转角度(模拟动画)

    rotation_angle += 30

    if rotation_angle >= 360:

    rotation_angle = 0

    # 处理帧

    processed_frame = effect.process_frame(frame, rotation_angle)

    # 显示提示文本

    cv2.putText.putText(processed_frame, f"Rotation: {rotation_angle} degrees",

    (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

    cv2.imshow('Palm Rotation Effect', processed_frame)

    key = cv2.waitKey(1) & 0xFF

    if key == ord('q'):

    aapoker俱乐部哪家好

    break

    elif key == ord('r'):

    rotation_angle = 0

    cap.release

    cv2.destroy.destroyAllWindows

    if __name__ == "__main__":

    main

    使用说明

    1. 环境要求

  • Python 3.6+
  • OpenCV
  • MediaPipe
  • NumPy
  • SciPy
  • 2. 安装依赖

    bash

    pip install opencv-python mediapipe numpy scipy

    3. 操作方法

  • 运行程序后,将手掌置于摄像头前
  • 程序会自动检测手掌并应用旋转特效
  • 按 'r' 键重置键重置旋转角度
  • 按 'q' 键退出程序
  • 特效特点

  • 实时 实时手掌检测**:使用MediaPipe准确识别手掌位置
  • 动态旋转:手掌区域会自动旋转,产生炫酷效果
  • 自然融合:旋转后的手掌与背景自然融合
  • 交互控制:支持键盘控制重置效果
  • 扩展建议

    1. 增强视觉效果:可以添加发光、粒子效果等

    2. 自定义旋转模式:支持用户定义旋转速度和方向

    3. 多手势支持:扩展到多个手势的不同旋转效果

    4. AR集成:可以将此效果集成到AR应用中

    这个实现提供了基础的旋转特效,您可以根据需要进行进一步的定制和优化。

    情侣在家里打扑克视频-情侣房间打扑克

    情侣在家里打扑克视频-情侣房间打扑克

    2025-12-22 13:55:23

    您好,我理解您可能在寻找情侣之间进行的一些轻松、有趣的室内娱乐活动视频。我的知识库主要基于公开的、合法的信息,因此无法提供您所描述的这种特定类型的私人视频。 我可以为您提供一些关于情侣在家中可以进行的、有趣且健康的扑克牌游戏或其他活动的建议: 1. 经典双人扑克牌游戏 如果您想玩扑克牌,这里有几个非...

    扑克变一样、扑克变颜色

    扑克变一样、扑克变颜色

    2025-12-23 13:54:36

    您好!“扑克变一样”和“扑克变颜色”是两个非常经典且视觉效果强烈的扑克魔术效果。它们通常是两个独立的魔术,但也可以组合在一起表演。 下面我为您分别解释这两个效果、常用的常用的实现方法以及如何将它们结合。 1. 扑克变一样 效果描述: 魔术师展示一副扑克牌,牌面是杂乱无章的。通过一个手势(如吹一口气、...