【问题标题】:OpenCV - VideoWriter FPSOpenCV - VideoWriter FPS
【发布时间】:2018-08-01 05:10:27
【问题描述】:

我正在构建一个脚本,通过 CSV 文件将边界框叠加到我的视频上。每帧有 n 个边界框,所以我只是遍历每帧中的边界框并在帧上绘制一个cv2.rectangle。结果,对于所有帧,我多次写入一个帧。

虽然我的 VideoWriter 构造函数将 23.97 FPS 作为参数,但生成的 FPS 要低得多。是否有算法或方法可以设置适当的 FPS 以补偿写入视频后的 FPS 下降?

下面是我的代码-sn-p:

avg_fws = counter_written/float(total_frames-1)
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = video.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('data/bounding_videos/%s.avi' % video_file, fourcc, fps * avg_fws, (width,height))
counter = 1
print (counter_written)
while (video.isOpened()):
    ret, frame = video.read()
    if ret == True:
        if len(frames_dict) != 0:
            for i in frames_dict[counter].keys():
                box_dim = frames_dict[counter][i]
                x, y, w, h = box_dim
                cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 255, 255), 3)
                out.write(frame)
        else:   
            out.write(frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):                                                                           
            break                                                                                                       
    else:                                                                                                               
        break                                                                                                           
    counter += 1                                                                                                        
video.release()                                                                                                         
out.release()                                                                                                           
cv2.destroyAllWindows()                            

计数器仅供我跟踪/访问帧,avg_fws 是每秒写入的平均帧数,基本上是total_num_of_frames_written / total_num_of_frames_in_video

【问题讨论】:

  • 您可能会多次写入同一帧,从而产生低 FPS 的错觉。我建议您附上代码 sn-p。
  • @ZdaR 我添加了一个代码 sn-p。是的,我多次写入同一个框架。低 FPS 的错觉是什么意思?
  • 只需将out.write(frame) 移到for 循环之外,以避免重写同一帧。
  • @ZdaR 非常感谢,成功了!将发布您的解决方案作为答案。
  • 是的,完成了:)

标签: opencv video-processing cv2


【解决方案1】:

您的代码的问题在于,您在 for 循环中为每个绘制的矩形编写多个帧。您需要做的是在一个框架上一次绘制所有矩形,并且只写一次。可以通过将 out.write(frame) 移出 for 循环来完成。

【讨论】: