使用 MediaPipe 进行人体姿势检测并解决 'TypeError: Can't convert object of type 'float' to 'str' for 'text'' 错误
使用 MediaPipe 进行人体姿势检测并解决 'TypeError: Can't convert object of type 'float' to 'str' for 'text'' 错误
本文将引导你使用 MediaPipe 库进行人体姿势检测,并解决在使用 cv2.putText() 函数时出现的 'TypeError: Can't convert object of type 'float' to 'str' for 'text'' 错误。
代码示例
import cv2
import mediapipe as mp
# 初始化MediaPipe的人体姿势模型
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose
# 打开输入视频文件
cap = cv2.VideoCapture('9.mp4')
# 获取输入视频的帧率和分辨率
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建输出视频文件
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('9_1.mp4', fourcc, fps, (width, height))
# 处理视频文件中的每一帧
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
while cap.isOpened():
# 读取一帧
ret, frame = cap.read()
if not ret:
break
# 将帧转换为RGB格式
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 处理人体姿势检测
results = pose.process(image)
# 判断是否检测到人体
if results.pose_landmarks:
# 绘制人体骨架
mp_drawing.draw_landmarks(
frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
# 获取动作类型
label = str(results.pose_world_landmarks.landmark[0].presence) # 将 float 转换为 str
# 在输出图片上显示动作类型
cv2.putText(frame, label, (5, 60),
cv2.FONT_HERSHEY_SIMPLEX, 1.1, (255, 100, 100), 2)
# 绘制头部关键点
nose = results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE]
x, y = int(nose.x * width), int(nose.y * height)
cv2.circle(frame, (x, y), 20, (220, 200, 100), -1)
else:
# 如果未检测到人体,则跳过本帧处理
cv2.putText(frame, 'No body detected', (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 将帧写入输出视频文件
out.write(frame)
# 显示当前帧的结果
cv2.imshow('MediaPipe Pose Detection press q exit', frame)
# 检测是否按下q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
错误原因及解决方法
'TypeError: Can't convert object of type 'float' to 'str' for 'text'' 错误的原因是 cv2.putText() 函数的 text 参数要求传入字符串类型的值,而 results.pose_world_landmarks.landmark[0].presence 返回的是 float 类型的值。
解决方法:将 label = results.pose_world_landmarks.landmark[0].presence 改为 label = str(results.pose_world_landmarks.landmark[0].presence),将 float 类型的值转换为字符串类型即可。
代码修改
将以下代码:
label = results.pose_world_landmarks.landmark[0].presence
改为:
label = str(results.pose_world_landmarks.landmark[0].presence)
总结
通过将 float 类型的值转换为字符串类型,可以解决 'TypeError: Can't convert object of type 'float' to 'str' for 'text'' 错误,并成功使用 cv2.putText() 函数在输出图像上显示动作类型。
原文地址: https://www.cveoy.top/t/topic/gM8s 著作权归作者所有。请勿转载和采集!