Установка частоты кадров не всегда работает так, как вы ожидаете. Это зависит от двух вещей:
- На что способна ваша камера.
- Поддерживает ли используемый вами текущий бэкэнд захвата изменение частоты кадров.
Итак, пункт (1). Ваша камера будет иметь список форматов, которые она может передавать на устройство захвата (например, ваш компьютер). Это может быть 1920x1080 при 30 кадрах в секунду или 1920x1080 при 60 кадрах в секунду, и это также определяет формат пикселей. Подавляющее большинство потребительских камер не позволяют вам изменять их частоту кадров с большей степенью детализации. И большинство библиотек захвата откажутся перейти на формат захвата, который камера не рекламирует.
Даже камеры машинного зрения, которые дают вам намного больше контроля, обычно предлагают только выбор частоты кадров (например, 1, 2, 5, 10, 15, 25, 30 и т. Д.). Если вам нужна неподдерживаемая частота кадров на аппаратном уровне, обычно единственный способ сделать это - использовать аппаратный запуск.
А точка (2). Когда вы используете cv.VideoCapture
, вы действительно вызываете библиотеку для конкретной платформы, такую как DirectShow или V4L2. Мы называем это бэкэндом. Вы можете точно указать, какой бэкэнд используется, используя что-то вроде:
cv2.VideoCapture(0 + cv2.CAP_DSHOW)
Существует множество CAP_X
, но только некоторые из них будут применяться к вашей платформе (например, CAP_V4L2
только для Linux). В Windows принуждение системы к использованию DirectShow - неплохая ставка. Однако, как указано выше, если ваша камера сообщает только о том, что она может выдавать 30 кадров в секунду и 60 кадров в секунду, запрос 10 кадров в секунду будет бессмысленным. Хуже того, многие настройки просто сообщают True
в OpenCV, когда они на самом деле не реализованы. Вы видели, что в большинстве случаев чтение параметров даст вам ощутимые результаты, однако, если параметр не реализован (например, экспозиция является распространенной, а не), то вы можете получить глупость.
Вам лучше подождать некоторое время, а затем прочитать последнее изображение.
Будьте осторожны с этой стратегией. Не делай этого:
while capturing:
res, image = cap.read()
time.sleep(1)
вам нужно убедиться, что вы постоянно очищаете буфер кадров камеры, иначе вы начнете видеть отставание в ваших видео. Должно работать что-то вроде следующего:
frame_rate = 10
prev = 0
while capturing:
time_elapsed = time.time() - prev
res, image = cap.read()
if time_elapsed > 1./frame_rate:
prev = time.time()
# Do something with your image here.
process_image()
Для такого приложения, как ручной детектор, лучше всего иметь поток, захватывающий изображения, и детектор, работающий в другом потоке (который также управляет GUI). Ваш детектор извлекает последнее захваченное изображение, запускает и отображает результаты (вам может потребоваться заблокировать доступ к буферу изображений во время чтения / записи). Таким образом, вашим узким местом является детектор, а не производительность камеры.