Python实现每秒保存实时视频中物体距离测量结果
实时视频距离测量与每秒记录方案(Python实现)
刚好做过类似的需求,给你一套直接能用的Python解决方案,结合OpenCV处理视频、time模块控制计时,完美实现每秒把时间和距离写入文本文件的需求。
整体实现思路
- 用OpenCV捕获实时视频流(摄像头/本地视频文件均可)
- 内置精准计时逻辑,确保每秒执行一次距离测量与文件写入
- 以追加模式写入文本文件,每次写入一行时间+距离的对应数据
- 预留距离测量的自定义接口,你可以直接对接自己的物体检测/距离计算代码
完整代码示例
import cv2 import time def measure_distance(frame): """ 这里替换成你自己的距离测量逻辑 参数:当前视频帧frame 返回:实际测量的距离值(比如厘米/米) 示例:假设你已经通过目标检测得到两个物体的坐标(x1,y1)和(x2,y2),计算像素距离后转实际距离 """ # 临时模拟距离数据,实际使用时替换成你的测量代码 import random return random.randint(1, 10) def main(): # 初始化视频捕获(0表示默认摄像头,也可以替换成视频文件路径) cap = cv2.VideoCapture(0) if not cap.isOpened(): print("无法打开视频流!") return # 初始化计时变量和输出文件 last_write_time = time.time() current_second = 1 # 从第1秒开始计数 output_file = open("distance_records.txt", "w") # 写入表头 output_file.write("Time,Distance\n") output_file.flush() # 强制写入磁盘,避免缓存丢失 print("开始记录,按Q键退出...") while True: ret, frame = cap.read() if not ret: print("视频流结束或读取失败!") break # 显示视频窗口(可选,方便调试查看) cv2.imshow("Real-time Video", frame) # 检查是否到了每秒写入的时间点 current_time = time.time() if current_time - last_write_time >= 1.0: # 测量当前帧的距离 distance = measure_distance(frame) # 写入数据:累计秒数 + 距离值 output_line = f"{current_second},{distance}\n" output_file.write(output_line) output_file.flush() # 立即写入磁盘,防止程序意外退出丢失数据 print(f"已记录:第{current_second}秒,距离={distance}") # 更新计时变量 last_write_time = current_time current_second += 1 # 按Q键退出程序 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放所有资源 cap.release() cv2.destroyAllWindows() output_file.close() print("记录结束,文件已保存为distance_records.txt") if __name__ == "__main__": main()
关键细节说明
- 计时准确性:用
time.time()计算时间差,确保每秒触发一次写入,比固定循环延迟更可靠(避免视频处理耗时影响计时精度) - 文件写入优化:
- 初始用
w模式创建文件并写入表头,后续用flush()强制写入磁盘,防止程序意外退出时数据丢失 - 每行数据用逗号分隔,方便后续用Excel、Pandas直接打开分析
- 初始用
- 距离测量接口:
measure_distance(frame)是核心自定义函数,你需要把自己的物体检测(比如YOLO、OpenCV轮廓检测)和距离计算逻辑放进去。比如通过两个物体的像素坐标,结合摄像头焦距、实际物体尺寸等参数转换为真实物理距离。 - 稳定性处理:代码包含了视频流打开失败、读取失败的判断,确保程序在异常场景下能优雅退出。
输出文件格式示例
运行后生成的distance_records.txt内容完全符合你的需求:
Time,Distance 1,7 2,4 3,8 4,2 5,3 6,1 ...
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

