#python #opencv #face-detection #raspberry-pi4 #picamera
Вопрос:
Я работаю над кодом, который считывает входящие видео с Raspberry Pi, выполняет распознавание лиц на кадрах, размещает кадры вокруг лиц, а затем записывает резервные копии кадров в файл MP4 с тем же FPS. Я использую OpenCV для открытия и чтения с PiCam.
Когда я посмотрел сохраненное видео, мне показалось, что оно движется слишком быстро. Я позволил своему коду работать около 2 минут, но мое видео длится 30 секунд. Когда я отключаю все постобработки (распознавание лиц), я могу наблюдать стабильную скорость на выходном видео.
Я могу понять, что Raspberry Pi имеет небольшой процессор для тяжелых вычислений, но не могу понять, почему длина видео короче? Возможно ли, что мой конвейер распознавания лиц работает намного медленнее, чем частота кадров в секунду камеры, поэтому буфер камеры должен отбрасывать кадры, которые не будут своевременно захвачены конвейером?
Любая помощь здесь высоко ценится!
Комментарии:
1. если вы хотите 2 минуты (
2*60
секунды) с частотой 30 кадров в секунду, то фильму нужны2*60*30
кадры —3600 frames
. Если вы напишете меньше кадров, то получите более короткое видео, и оно будет работать быстрее. — Установка 30 кадров в секунду только сообщит игроку, как быстро отображать кадры, но не добавит пропущенные кадры. Если вы работаете с PiCam, вам придется читать и записывать 30 кадров в секунду, поэтому для каждого кадра у вас есть только 33 мс (1000 мс / 30). Единственная идея — запустить его в двух потоках — один поток, чтобы считывать кадры с камеры, обрабатывать их и помещать в буфер/переменную. Второй поток для записи буфера каждые 33 мс2. да, камера с частотой 30 кадров в секунду может получать новое изображение от светодиодного датчика каждые 33 мс и помещать его в буфер, но если код работает медленнее, то у нее нет времени получать новый кадр каждые 33 мс, поэтому она теряет несколько кадров. И если код выполняется быстрее, то он может получить один и тот же кадр несколько раз и может генерировать более медленное видео.
3. Интересный. Я вижу, что здесь упоминается, что если код выполняется быстрее, то он может получить один и тот же кадр несколько раз. Я предполагал, что когда мы прочитаем кадр, то он больше не будет прочитан снова. Если мы вернемся к чтению с камеры очень быстро, то я подумал, что код должен быть заблокирован при вызове функции до тех пор, пока он не получит новый кадр. Теперь, как я могу убедиться, что прочитал каждый кадр только один раз?