如何正确计算视频时间以在OpenCV中按指定秒数绘制对应坐标的圆形
问题解决方案
核心问题梳理
- 第一次代码问题:
- 变量名冲突:导入了time模块后,自定义存储时间的列表也命名为time,导致模块调用异常
- 触发条件逻辑错误:
time_passed % (time[i]*1000)为非0即触发的判断逻辑完全错误,模运算结果不为0的场景远多于等于0的场景,且视频播放时间存在微小误差,无法保证刚好整除 - 未做帧读取有效性判断:没有判断
ret返回值,视频读取完毕后操作空帧会报错 - 仅绘制时才调用imshow,其余时间画面不更新
- 第二次代码问题:
- 导包错误:
import cv cv属于笔误,应为import cv2 - 逻辑嵌套错误:每读取一帧就遍历所有坐标点,count累加逻辑完全不符合需求
- 绘制参数错误:
cv2.circle的y坐标参数错写为x,导致所有圆位置异常 - 缺失
cv2.waitKey调用和退出逻辑,且未判断ret导致空帧报错
- 导包错误:
修正后可运行代码
import cv2 import numpy as np import time x_list = ['20' , '30' , '40', '50','60' , '70' , '80', '90','100' , '110' ] y_list = ['20' , '30' , '40', '50','60' , '70' , '80', '90','100' , '110' ] times = [1,2,3,4,5,6,7,8,9,10] # 单位:秒 # 初始化视频读取对象,替换为你自己的视频路径 cap = cv2.VideoCapture(r'C:/Users/aless/Documents/GitHub/Tobii-Glasses-Thesis/video/scenevideo5.mp4') # 获取视频帧率 fps = cap.get(cv2.CAP_PROP_FPS) # 已经绘制到第几个点的标记 point_index = 0 total_points = len(times) while cap.isOpened(): ret, frame = cap.read() # 视频读取完毕直接退出 if not ret: break # 获取当前已播放时间(秒) current_sec = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 只要还有未绘制的点,且当前播放时间已经到了对应点的绘制时间,就绘制对应点 while point_index < total_points and current_sec >= times[point_index]: # 注意这里的坐标要转成整数 cx = int(x_list[point_index]) cy = int(y_list[point_index]) cv2.circle(frame, (cx, cy), 10, (255, 0, 0), -1) point_index += 1 # 每次循环都更新画面 cv2.imshow('test', frame) # 按q退出,等待时间根据帧率调整保证播放速度正常 if cv2.waitKey(int(1000/fps)) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
关键改动说明
- 修正了所有变量命名冲突、导包错误、参数错误的低级问题
- 更换触发逻辑为判断当前播放时间是否大于等于对应点的绘制时间,避免了模运算的误差问题
- 增加帧有效性判断,避免空帧操作报错
- 调整
waitKey等待时间和视频帧率匹配,保证播放速度正常 - 每次循环都更新画面,保证视频正常播放不卡顿
内容的提问来源于stack exchange,提问作者BearGrillz
相关产品推荐
相关产品推荐

