Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV-视频编写器FPS_Opencv_Video Processing_Cv2 - Fatal编程技术网

OpenCV-视频编写器FPS

OpenCV-视频编写器FPS,opencv,video-processing,cv2,Opencv,Video Processing,Cv2,我正在构建一个脚本,通过CSV文件将边界框覆盖到我的视频上。每一帧都有n个边框,所以我只是在每一帧中的边框上迭代,并在帧上绘制一个cv2.矩形。因此,对于所有帧,我多次向帧写入 虽然我的VideoWriter构造函数将23.97 FPS作为参数,但得到的FPS要低得多。是否有一种算法或方法可以设置适当的FPS来补偿写入视频后FPS的下降 下面是我的代码片段: avg_fws = counter_written/float(total_frames-1) width = int(video.get

我正在构建一个脚本,通过CSV文件将边界框覆盖到我的视频上。每一帧都有n个边框,所以我只是在每一帧中的边框上迭代,并在帧上绘制一个cv2.矩形。因此,对于所有帧,我多次向帧写入

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

下面是我的代码片段:

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是每秒写入的平均帧数,基本上是写入的帧总数/视频中的帧总数

代码的问题在于,在for循环中为绘制的每个矩形编写多个帧。你需要做的是在一个框架上一次画出所有的矩形,并且只写一次。这可以通过移出for循环来完成。writeframe退出for循环。

可能多次写入同一帧,从而产生低FPS的错觉。我建议您附加一个代码段。@ZdaR我添加了一个代码段。是的,我在同一帧上写了多次。你所说的低FPS是什么意思?只需将out.writeframe移到for循环之外,以避免重新写入同一帧。@ZdaR非常感谢,成功了!将发布您的解决方案作为答案。是的,当然完成: