使用OpenCV批量提取视频关键点时数据串扰问题的修正方法
问题修正方案
你的问题核心是未正确终止单视频的帧循环、未隔离各视频的关键点数据、资源未及时释放,导致不同视频的关键点混在一起。以下是具体修正步骤和完整代码:
关键修正点
- 规范路径拼接:用
os.path.join()避免因路径分隔符缺失导致的文件读取错误 - 每段视频单独初始化关键点存储:确保每段视频的数据独立,不与上一段累加
- 正确判断视频结束:当
cap.read()返回的ret为False时,立即终止当前视频的帧循环 - 释放视频资源:处理完单视频后调用
cap.release(),避免资源占用影响后续视频读取 - 对应保存JSON:每段视频处理完成后,单独保存为与原视频文件名对应的JSON文件
修正后的完整代码
import os import cv2 import json # 视频文件夹路径 video_path = "path to video folder" # 遍历文件夹中的所有文件 for filename in os.listdir(video_path): # 只处理视频文件(可根据实际格式调整后缀) if filename.endswith(('.mp4', '.avi', '.mov')): # 规范拼接视频文件的完整路径 full_video_path = os.path.join(video_path, filename) # 初始化当前视频的关键点存储列表(每段视频单独初始化,避免数据混入) video_keypoints = [] # 打开视频文件 cap = cv2.VideoCapture(full_video_path) if not cap.isOpened(): print(f"无法打开视频文件: {filename}") continue # 循环读取视频帧 while True: ret, frame = cap.read() # 当ret为False时,说明视频帧已读取完毕,终止循环 if not ret: break # --- 这里替换成你的关键点提取逻辑 --- # 示例:假设你用某个模型提取到当前帧的keypoints # keypoints = your_keypoint_detector(frame) # video_keypoints.append(keypoints) # --- 关键点提取逻辑结束 --- # 释放当前视频的资源 cap.release() # 将当前视频的关键点保存为JSON文件 json_filename = os.path.splitext(filename)[0] + ".json" json_save_path = os.path.join(video_path, json_filename) with open(json_save_path, 'w', encoding='utf-8') as f: json.dump(video_keypoints, f, ensure_ascii=False, indent=2) print(f"已完成视频 {filename} 的关键点提取并保存为 {json_filename}")
额外说明
- 请根据你实际使用的关键点检测模型,替换代码中
--- 关键点提取逻辑 ---部分的内容 - 如果你的视频格式不是代码中列出的
.mp4/.avi/.mov,请补充到endswith()的参数中 - 若需要跳过非视频文件,
if filename.endswith(...)的判断可以避免处理无关文件
内容的提问来源于stack exchange,提问作者hishan lu
相关产品推荐
相关产品推荐

