我的文件夹中有一个视频列表(每个视频 10 秒),我试图循环遍历每个动作视频以提取关键点并将它们保存为 json 文件。
path = "path to video folder"
for file in os.listdir(path):
cap = cv2.VideoCapture(path+file)
while cap.isOpened():
try:
ret, frame = cap.read()
我遇到了一个问题,提取的数据有一些关键点来自其他视频,我只想运行此代码,以视频完成的停止时间结束,暂停,开始下一个视频。我该如何帮助纠正这个问题?
问题似乎是你的关键点跟踪器没有在每个视频后正确重置。你需要在开始处理新视频时重置跟踪器。遗憾的是,你没有包含关键点提取代码,所以我无法提供具体的解决方案。
但是,我可以提供一个关于如何使用 OpenCV 和 MediaPipe (一个用于姿态估计的强大库)的完整示例:
import cv2
import mediapipe as mp
import os
import json
# 初始化 MediaPipe 姿态估计器
mp_pose = mp.solutions.pose.Pose(
static_image_mode=False,
min_detection_confidence=0.5,
min_tracking_confidence=0.5
)
# 视频文件夹路径
path = "path/to/video/folder/"
# 循环遍历文件夹中的每个视频
for file in os.listdir(path):
if not file.endswith((".mp4", ".avi")): # 确保只处理视频文件
continue
cap = cv2.VideoCapture(os.path.join(path, file))
keypoints_data = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 将帧从 BGR 转换为 RGB
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 处理 MediaPipe 姿态估计
results = mp_pose.process(frame_rgb)
# 提取关键点
if results.pose_landmarks:
frame_keypoints = []
for landmark in results.pose_landmarks.landmark:
frame_keypoints.append({
'x': landmark.x,
'y': landmark.y,
'z': landmark.z,
'visibility': landmark.visibility
})
keypoints_data.append(frame_keypoints)
else:
# 如果在帧中未检测到姿态,则附加空列表
keypoints_data.append([])
cv2.imshow('Frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# 将关键点数据保存为 JSON 文件
with open(f"{file[:-4]}.json", 'w') as f:
json.dump(keypoints_data, f)
# 关闭 MediaPipe 姿态估计器
mp_pose.close()
解释:
-
导入必要的库:
cv2
用于视频处理,mediapipe
用于姿态估计,os
用于文件处理,json
用于保存数据。 - 初始化 MediaPipe 姿态估计器。
- 循环遍历视频文件夹中的每个文件:
-
检查文件是否是视频文件(
.mp4
或.avi
)。 - 打开视频文件。
- 初始化一个空列表来存储关键点数据。
- 循环遍历视频的每一帧:
- 读取一帧。
- 将帧从 BGR 转换为 RGB(MediaPipe 需要)。
- 使用 MediaPipe 处理帧以进行姿态估计。
-
如果检测到姿态,则提取关键点坐标(x、y、z)及其可见性并将其附加到
keypoints_data
列表中。如果在帧中未检测到姿态,则附加一个空列表。 - 可选:显示带有检测到的关键点的帧。
- 在处理完所有帧后:
- 释放视频捕获对象。
- 关闭所有 OpenCV 窗口。
- 将提取的关键点数据保存到 JSON 文件中。
- 最后,关闭 MediaPipe 姿态估计器。
此脚本将为每个视频创建一个单独的 JSON 文件,其中包含每帧提取的关键点。这应该可以解决来自不同视频的关键点混合的问题。
标签:python,opencv,computer-vision From: 73565108