使用OpenCV和MediaPipe库——增强现实殊效(在手腕添加假造手表)
https://i-blog.csdnimg.cn/direct/8e862f84363c4d0589f76baf5e17470c.jpeg目录
代码实现思绪
整体代码
配套资源阐明
关键实现细节
效果优化
效果展示
https://i-blog.csdnimg.cn/direct/8364e0d8bbd24705a14fb5a4af20f839.jpeg
代码实现思绪
[*] 初始化:
[*]使用MediaPipe库来处置惩罚人体姿势估计,特殊是手部位置。
[*]加载了一张带被抠图的手表图像(watch.png)作为要叠加到视频帧上的对象。
[*] 打开摄像头并开始捕捉视频流:
[*]使用OpenCV的VideoCapture类打开默认摄像头(设备ID为0),然后进入一个循环不停读取视频帧。
[*] 姿势检测:
[*]每一帧首先被转换为RGB格式,因为MediaPipe需要RGB输入。
[*]利用mp_pose.Pose举行人体姿势猜测,并将结果生存在results变量中。
[*] 坐标变更和手表图像处置惩罚:
[*]从姿势猜测结果中获取左手腕的关键点坐标,并将其归一化坐标转换为实际像素坐标。
[*]根据手腕的位置调解手表图像的巨细,并盘算出它应该放置的具体位置,确保手表中央与手腕关键点对齐。
[*]分离手表图像的Alpha通道(即透明度信息),用于后续的图像混合操作。
[*] 图像混合:
[*]将手表图像按照盘算好的位置叠加到视频帧上。这个过程涉及到利用Alpha通道对手表图像和原始视频帧举行加权混合,以保证手表图像可以大概正确表现其透明部分。
[*] 绘制关键点(可选):
[*]在视频帧上绘制出所有检测到的人体关键点和它们之间的连线,资助可视化检测结果。
[*] 展示结果:
[*]表现最终合成后的图像。假如用户按下键盘上的“q”键,则退出循环并关闭所有窗口,克制视频捕捉。
[*] 资源释放:
[*]循环结束后,释放摄像头资源并关闭所有OpenCV创建的窗口。
https://i-blog.csdnimg.cn/direct/bc53c2bf36b141ac8b1f4601f8961a4b.jpeg
整体代码
import cv2
import mediapipe as mp
import numpy as np#numpy 用于图像混合
# 初始化 MediaPipe 组件
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose
# 加载带透明通道的手表图片 (PNG格式)
watch_img = cv2.imread("watch.png", cv2.IMREAD_UNCHANGED)# 确保图片路径正确
if watch_img is None:
raise FileNotFoundError("手表图片未找到,请检查 watch.png 文件路径")
# 打开摄像头
cap = cv2.VideoCapture(0)
# 初始化姿势检测
with mp_pose.Pose(
min_detection_confidence=0.7,
min_tracking_confidence=0.7
) as pose:
while cap.isOpened():
success, frame = cap.read()
if not success:
break
# 转换为 RGB 格式并进行姿势检测
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = pose.process(image)
# 转换回 BGR 用于显示
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.pose_landmarks:
# ============== 关键点获取 ==============
# 获取左手腕关键点
LEFT_WRIST = mp_pose.PoseLandmark.LEFT_WRIST
wrist_landmark = results.pose_landmarks.landmark
# 获取图像尺寸
h, w, _ = image.shape
# 将归一化坐标转换为像素坐标
wrist_x = int(wrist_landmark.x * w)
wrist_y = int(wrist_landmark.y * h)
# ============== 手表处理 ==============
# 调整手表大小(原图尺寸的 1/4)
scale_factor = 0.25
watch_h, watch_w = int(watch_img.shape * scale_factor), int(watch_img.shape * scale_factor)
resized_watch = cv2.resize(watch_img, (watch_w, watch_h))
# 计算叠加位置(使手表中心对准手腕)
y_start = wrist_y - watch_h // 2
y_end = y_start + watch_h
x_start = wrist_x - watch_w // 2
x_end = x_start + watch_w
# 确保不会超出画面边界
if y_start >= 0 and y_end <= h and x_start >= 0 and x_end <= w:
# 分离 Alpha 通道
alpha = resized_watch[:, :, 3] / 255.0
inverse_alpha = 1 - alpha
# 按通道混合图像
for c in range(3):
image = \
resized_watch[:, :, c] * alpha + \
image * inverse_alpha
# ============== 绘制关键点(可选) ==============
mp_drawing.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=mp_drawing.DrawingSpec(color=(120, 220, 160), thickness=2),
connection_drawing_spec=mp_drawing.DrawingSpec(color=(120, 160, 220), thickness=2)
)
# 显示画面
cv2.imshow('AR Watch Demo', image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
https://i-blog.csdnimg.cn/direct/ad715f5a80a0417c8a39f3bd99013987.jpeg
配套资源阐明
[*] 手表图片要求:
[*] 格式:PNG(带透明通道)
[*] 推荐尺寸:500x500 像素左右
[*] 示例图片(可通过搜索引擎查找 "watch png transparent")
[*] 文件布局:
your_project_folder/
├── ar_watch_demo.py# 代码文件
└── watch.png # 手表素材
关键实现细节
[*] 坐标转换:
wrist_x = int(wrist_landmark.x * w)# 将归一化坐标转换为实际像素坐标
wrist_y = int(wrist_landmark.y * h)
[*] 透明图像混合:
alpha = resized_watch[:, :, 3] / 255.0# 提取 Alpha 通道并归一化
for c in range(3):# 对 RGB 通道分别混合
image = \
resized_watch[:, :, c] * alpha + \
image * (1 - alpha)
[*] 边界保护:
if y_start >= 0 and y_end <= h and x_start >=0 and x_end <= w:
# 仅当手表完全在画面内时才进行叠加 效果优化
[*] 动态巨细调解:
# 根据手腕到摄像头的距离动态调整大小(需计算深度信息)
scale_factor = 0.2 + 0.1 * (wrist_landmark.z * 10)# z 值为估计的深度
[*] 旋转适配:
# 获取前臂方向(手腕-手肘向量)
LEFT_ELBOW = mp_pose.PoseLandmark.LEFT_ELBOW
elbow_landmark = results.pose_landmarks.landmark
angle = np.arctan2(wrist_y - elbow_y, wrist_x - elbow_x)
rotated_watch = cv2.warpAffine(resized_watch, ...)# 应用旋转矩阵
[*] 性能优化:
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)# 降低分辨率到 640x480
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) https://i-blog.csdnimg.cn/direct/1c7c0923ecf84c7db376a8ade18e2ee4.jpeg
效果展示
https://i-blog.csdnimg.cn/direct/6d45ab41a9374ccea43ef2678b278d79.png
https://i-blog.csdnimg.cn/direct/9a6415340f3c41a093ce1e124fefe668.png
https://i-blog.csdnimg.cn/direct/6bd9128f47a24046849d403a8d088c05.jpeg
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]