Для проекта компьютерного зрения, над которым я работаю, мне нужно получать изображения с помощью веб-камеры Logitech C920. Для этого я использую OpenCV VideoCapture, но проблема, с которой я сталкиваюсь, заключается в том, что изображение, которое я делаю в определенный момент, не показывает последнее, что видит камера. То есть, если я делаю снимок с временной меткой t, он показывает, что камера видела с временной меткой (t - дельта), так сказать.
Я сделал это, написав программу, которая увеличивает счетчик и показывает его на экране. Я направил камеру на экран и позволил записи. Когда счетчик достигает определенного значения, скажем, 10000, он захватывает изображение и сохраняет его с именем файла «counter_value.png» (например, 10000.png). Таким образом, я смог сравнить текущее значение счетчика с текущим значением, которое видит камера. Я заметил, что большую часть времени задержка составляет около 4-5 кадров, но это не фиксированное значение.
Я видел подобные сообщения об этой проблеме, но ни один из них не помог. Некоторые люди рекомендовали поместить процедуру захвата кадров в отдельный поток и обновить переменную «current_frame» в Mat. Я пробовал это, но по какой-то причине проблема все еще присутствует. Кто-то еще упомянул, что камера хорошо работала в Windows (но мне нужно использовать Linux). Я попытался запустить тот же код в Windows, и действительно, задержка составила всего около 1 кадра (что также могло быть связано с тем, что камера не видела счетчик, потому что экран не обновлялся достаточно быстро).
Затем я решил запустить простую программу просмотра веб-камеры, основанную только на коде V4L2, думая, что проблема может быть связана с OpenCV. Я снова столкнулся с той же задержкой, что заставило меня поверить, что драйвер использует какой-то буфер для кэширования изображений.
Я новичок в V4L2, и мне действительно нужно решить эту проблему как можно скорее, поэтому мои вопросы к вам, ребята:
- Кто-нибудь нашел решение для получения последнего изображения с использованием V4L2 (и, возможно, OpenCV)?
- Если нет способа решить ее с помощью V4L2, кто-нибудь знает другую альтернативу решению этой проблемы в Linux?
С уважением,
Михай