使用mediapip 检测pose 并作为一个服务
代码
import uvicorn
from fastapi import FastAPI, HTTPException
import cv2
import mediapipe as mp
from pydantic import BaseModel
app = FastAPI()
# 创建一个模型来序列化姿态数据
class PoseData(BaseModel):
landmarks: list
# 初始化MediaPipe的姿态估计模型
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
# 初始化摄像头
cap = cv2.VideoCapture("q888.mp4")
@app.get("/pose")
def get_pose():
# 从摄像头读取一帧
success, image = cap.read()
if not success:
raise HTTPException(status_code=500, detail="Failed to capture image")
# 转换为RGB格式,因为MediaPipe需要RGB图像
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 处理图像以获取姿态数据
results = pose.process(image)
# 如果没有检测到姿态,返回错误
if not results.pose_landmarks:
raise HTTPException(status_code=404, detail="No pose detected")
# 获取所有地标的位置和ID
landmarks = []
for landmark in results.pose_landmarks.landmark:
landmarks.append({
'x': landmark.x,
'y': landmark.y,
'z': landmark.z,
'visibility': landmark.visibility
})
# 返回姿态数据
return PoseData(landmarks=landmarks)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
# 释放资源
cap.release()
pose.close()
解析
当然,以下是该代码的逐行解析:
import uvicorn
from fastapi import FastAPI, HTTPException
import cv2
import mediapipe as mp
from pydantic import BaseModel
- 导入必要的库:
uvicorn
用于运行 FastAPI 应用,FastAPI
是一个现代、快速(高性能)的 Web 框架,用于构建 API,HTTPException
用于处理 HTTP 错误,cv2
是 OpenCV 的 Python 绑定库,用于图像处理,mediapipe
是一个跨平台的机器学习解决方案库,用于构建各种感知增强应用,BaseModel
用于数据验证和设置类型提示。
app = FastAPI()
- 创建一个 FastAPI 实例。
class PoseData(BaseModel):
landmarks: list
- 定义一个 Pydantic 模型
PoseData
,用于序列化和反序列化姿态数据。该模型包含一个名为landmarks
的列表字段。
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
- 初始化 MediaPipe 的姿态估计模型。
cap = cv2.VideoCapture("q888.mp4")
- 初始化摄像头,这里使用的是视频文件
q888.mp4
而不是实际的摄像头。
@app.get("/pose")
def get_pose():
- 定义一个路由
/pose
,这是一个 GET 请求,返回姿态数据。
success, image = cap.read()
if not success:
raise HTTPException(status_code=500, detail="Failed to capture image")
- 从摄像头读取一帧图像,如果读取失败,则抛出一个 HTTP 500 内部服务器错误。
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
- 将图像从 BGR 格式转换为 RGB 格式,因为 MediaPipe 需要 RGB 图像。
results = pose.process(image)
- 使用 MediaPipe 的姿态估计模型处理图像以获取姿态数据。
if not results.pose_landmarks:
raise HTTPException(status_code=404, detail="No pose detected")
- 如果没有检测到姿态,则抛出一个 HTTP 404 未找到错误。
landmarks = []
for landmark in results.pose_landmarks.landmark:
landmarks.append({
'x': landmark.x,
'y': landmark.y,
'z': landmark.z,
'visibility': landmark.visibility
})
- 遍历检测结果中的所有地标,并将它们的位置和可见性添加到
landmarks
列表中。
return PoseData(landmarks=landmarks)
- 返回序列化的姿态数据。
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
- 如果该脚本作为主程序运行,则启动 FastAPI 应用,监听所有网络接口的 8000 端口。
cap.release()
pose.close()
- 释放摄像头资源和关闭 MediaPipe 的姿态估计模型。这段代码实际上不会执行,因为
uvicorn.run
是一个阻塞调用,它不会继续执行之后的代码。正确的方法是在一个事件循环中处理资源的释放。
原文地址:https://blog.csdn.net/weixin_32759777/article/details/140372958
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!