Запись с веб-камеры Python, дающая более низкое число кадров в секунду
Я использую opencv(cv2) в Python для записи видео (требуется только видео) с нескольких веб-камер одновременно. Хотя они не синхронизированы, они записывают с постоянной частотой кадров. Проблемы
Они записывают со скоростью 4 кадра в секунду, когда разрешение установлено на 1080p, а желаемое значение составляет 30 кадров в секунду. Камеры, которые я использую, поддерживают это. Хотя при предварительном просмотре частота кадров составляет 30 кадров в секунду, это наводит меня на мысль, что во время записи я могу ошибаться. Я использую потоки, как в библиотеке imutils, чтобы получить видео, как предлагается в этом блоге.
Есть ли в любом случае синхронизировать различные выходы камеры (видео).
Спецификации ПК:
- Intel i5 7thgen,
- 8 ГБ оперативной памяти ddr3,
- SSD жесткий диск.
Я использую веб-камеры Genius 32200312100 WideCam F100 USB 2.0 WebCam.
Я не думаю, что это ограничение, так как я отслеживал использование процессора и памяти во время записи.
Любая помощь приветствуется, и если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.
Я открыт для использования любых кодировок, которые не ставят под угрозу качество изображения.
Изменить: я публикую код ниже.
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)