基于Python与OpenCV的运动学研究:帧内物体坐标提取工具开发需求
快速实现代码方案
以下是直接可用的代码,适配你的需求,步骤清晰,新手能快速跑通:
依赖安装
先安装必要库:
pip install opencv-python pandas
完整代码
import cv2 import pandas as pd import os # 配置参数 FRAME_FOLDER = "你的帧文件夹路径" # 替换成你的帧存放目录 CSV_SAVE_PATH = "motion_data.csv" # 按文件名排序帧(确保顺序正确) frame_files = sorted([f for f in os.listdir(FRAME_FOLDER) if f.endswith(('.jpg', '.png', '.jpeg'))]) data = [] current_frame_idx = 0 def mouse_callback(event, x, y, flags, param): global current_frame_idx # 仅处理左键点击 if event == cv2.EVENT_LBUTTONDOWN: # 记录帧号(从1开始)、x坐标、y坐标 frame_num = current_frame_idx + 1 data.append({"frame_num": frame_num, "x": x, "y": y}) print(f"已记录:帧{frame_num} ({x}, {y})") # 切换到下一帧 current_frame_idx += 1 # 创建窗口并绑定鼠标事件 cv2.namedWindow("Motion Tracker") cv2.setMouseCallback("Motion Tracker", mouse_callback) # 逐帧显示 while current_frame_idx < len(frame_files): frame_path = os.path.join(FRAME_FOLDER, frame_files[current_frame_idx]) frame = cv2.imread(frame_path) if frame is None: print(f"无法读取帧:{frame_path}") current_frame_idx += 1 continue # 在窗口显示帧,标注当前帧号 cv2.putText(frame, f"Frame: {current_frame_idx + 1}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow("Motion Tracker", frame) # 等待点击,按ESC可提前退出 key = cv2.waitKey(0) if key == 27: # ESC键 break # 保存数据到CSV if data: df = pd.DataFrame(data) df.to_csv(CSV_SAVE_PATH, index=False) print(f"数据已保存至 {CSV_SAVE_PATH}") else: print("未记录任何数据") # 清理窗口 cv2.destroyAllWindows()
使用说明
- 替换
FRAME_FOLDER为你的帧文件存放目录,确保帧文件命名是按顺序的(比如frame_001.jpg、frame_002.jpg) - 运行代码,弹出窗口后用左键点击每帧中的运动物体,程序会自动切换到下一帧
- 所有帧处理完或按ESC退出后,数据会自动保存到指定的CSV文件
- CSV文件包含
frame_num(帧号)、x、y三列,后续可以用Excel或Python的numpy/pandas分析速度、加速度
关键细节说明
- 帧排序:用
sorted()确保帧按顺序加载,避免乱序 - 鼠标回调:仅响应左键点击,点击后自动推进帧索引
- 数据保存:用pandas快速生成CSV,比原生csv模块更简洁,新手易上手
- 异常处理:跳过无法读取的帧,避免程序崩溃
内容的提问来源于stack exchange,提问作者Ricardo Niedmann
相关产品推荐
相关产品推荐

