Python网络摄像头记录的fps低于预期

时间:2017-07-30 15:19:25

标签: python-3.x opencv video python-multithreading webcam-capture

我在python中使用opencv(cv2)来同时从多个网络摄像头录制视频(仅需要视频)。虽然它们没有同步,但它们以恒定的帧速率记录。问题是

  1. 当分辨率设置为1080p时,它们以4fps记录,而期望值为30fps。我使用的相机支持这个。虽然帧速率预览是30fps,但这让我相信在录制时我可能会做错事。我在imutils库中使用线程来获取this博文中建议的视频。

  2. 无论如何都要同步不同的相机输出(视频)。

  3. PC规格:

    • Intel i5 7thgen,
    • 8gb ddr3 ram,
    • SSD harddrive。

    我正在使用的网络摄像头是Genius 32200312100 WideCam F100 USB 2.0 WebCam。

    我不认为这些是限制因为我在录制时一直在监视CPU和内存使用情况。

    感谢任何帮助,如果需要任何进一步的信息,请随时询问。

    我愿意使用任何不会影响图片质量的编码。

    编辑:我正在发布以下代码。

     class VideoRecorder():
    
        #Function that runs once when the VideoRecorder class is called.
        def __init__(self,cam_id = 0):
    
            #Initialize the camera and set its properties
            self.cam_id = cam_id
            self.framerate = 30
            self.video_height = 720
            self.video_width = 1280
            self.cap = cv2.VideoCapture(self.cam_id)
            self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,self.video_height)
            self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,self.video_width)
            self.cap.set(cv2.CAP_PROP_FPS,self.framerate)
    
            # Grab a initial frame, It is to warm up the camera.
            # This frame will not be used
            temp1, temp2 = self.cap.read()
    
            #Set the place where the file is to be stored
            storage_path = "{Output_folder}"
            file_name = datetime.datetime.now().strftime("%m%d%Y_%H%M%S")
            file_name = "cam_" + str(self.cam_id) + "_" + file_name + ".avi"
            self.file = os.path.join(storage_path,file_name)
    
            #Initialize a videowriter object to save the recorded frames to a file
            self.fourcc = cv2.VideoWriter_fourcc(*'H264')
            self.out = cv2.VideoWriter(self.file,self.fourcc,self.framerate,
                                       (self.video_width,self.video_height))
    
    
        def record(self, timer = 10):
    
            #Start a timer for the recording to see how long the recording should be
            self.start_time = time.time()
            #Start a frame counter to calculate the framerate at the end
            self.frame_count = 0
    
            #Run an loop for given time to get frames from camera and store them
            while(self.cap.isOpened()):
                tora1 = time.time()
                ret, frame = self.cap.read()
                print("Time for reading the frame",time.time()-tora1)
    
                if ret == True:
                    tora2 = time.time()
                    self.out.write(frame)
                    print("Time for write",tora2-time.time())
                    self.frame_count += 1
                else:
                    break
    
                current_time = time.time()
                self.elapsed_time = current_time - self.start_time
                if(self.elapsed_time > timer):
                    self.stop()
                    break
    
        #Start the recording in a thread
        def start(self, timer):
            video_thread = threading.Thread(target = self.record, args = (timer,))
            #video_thread.daemon = True
            video_thread.start()
    
    
        #Print the fps and release all the objects
        def stop(self):
            print("Frame count: %d"%self.frame_count)
            self.fps = self.frame_count/self.elapsed_time
            print(self.elapsed_time)
            print("fps: %f"%self.fps)
            self.out.release()
            self.cap.release()
            print("Done")
    
    
    if __name__ == "__main__":
    
        #Giving which arguments to pass to the script form command line ans
        #getting them in a args structure
        ap = argparse.ArgumentParser()
        ap.add_argument("-t", "--runtime", type = int, default = 10,
                        help = "TIme for which the videorecoder runs")
        ap.add_argument("-id", "--cam_id", type=int, default= 0,
            help="give camera id")
        args = vars(ap.parse_args())
    
        required_time = args["runtime"]
    
        video_thread = []
    
        for i in range(args["cam_id"]+1):
            t = VideoRecorder(i)
            video_thread.append(t)
            t.start(required_time)
    

0 个答案:

没有答案