You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确计算视频时间以在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:36:04