Странные результаты с использованием V4L2, python, на raspberry pi 3

Странный результат кодирования, который не имеет особого смысла. Я пытаюсь захватить с камеры raspberry pi с помощью драйвера V4L2, так как мне нужно использовать cv2 для обработки изображений. Я использую python для написания кода.

Странность вращается вокруг захвата изображений с использованием cv2. когда я набираю следующие команды

import cv2
from matplotlib import pyplot

camera = cv2.VideoCapture(0)
grab,frame = camera.read()
pyplot.imshow(frame)

Я могу захватить кадр и отобразить его с помощью matplotlib. Когда я беру второй кадр

grab,frame2 = camera.read()
pyplot.imshow(frame2)

Код захватит второй кадр и отобразит его отлично.

Однако, когда я пытаюсь использовать существующую переменную, например frame или frame2, камера не захватывает новый кадр, а просто печатает предыдущий кадр.

Я попытался очистить переменную, набрав

frame = []
grab,frame = camera.read()
pyplot.imshow(frame)    

но это не решило проблему, по-прежнему печатая предыдущий кадр.


person Hojo.Timberwolf    schedule 26.09.2018    source источник
comment
Попробуйте проверить статус ошибки из camera.read()   -  person Mark Setchell    schedule 26.09.2018
comment
проверить статус ошибки? функция camera.read() не выдает ошибку. Он генерирует матрицу HxWx3 с dtype = uint8.   -  person Hojo.Timberwolf    schedule 26.09.2018
comment
grab устанавливается в True или False в зависимости от того, было ли чтение успешным. Я предлагал вам проверить это.   -  person Mark Setchell    schedule 26.09.2018
comment
Я понимаю. Переменная захвата имеет значение True всякий раз, когда я использую camera.read(). В качестве теста я установил cheese, чтобы проверить, смогу ли я получить видео через драйвер V4L2. Я смог просмотреть видео в полном порядке. Это должно быть проблемой с openCV 3.4.1   -  person Hojo.Timberwolf    schedule 26.09.2018
comment
Откуда вы знаете, что он все еще печатает именно первый кадр?   -  person Mark Setchell    schedule 26.09.2018


Ответы (1)


Я думаю, что вы "страдаете от буферизации"!

Когда OpenCV считывает кадр, он имеет тенденцию собирать несколько, я думаю, это 5 кадров или около того, или может быть какой-то алгоритм, который определяет доступную память или что-то подобное.

В любом случае, ответ заключается в том, чтобы прочитать еще несколько кадров, чтобы очистить буфер, а затем он получит несколько новых кадров.

person Mark Setchell    schedule 26.09.2018
comment
Когда я использовал Cheese для захвата видео с камеры pi с помощью V4L2, я получил следующее (cheese:3575): cheese-WARNING **: Отбрасывается много буферов.: gstbasesink.c(2834): gst_base_sink_is_too_late (): /GstCameraBin:camerabin/GstViewfinderBin:vf-bin/ClutterGstVideoSink:cluttergstvideosink0: Может быть проблема с временными метками, или этот компьютер работает слишком медленно. Я использую Raspberry Pi 3, у которого всего 1 Гб оперативной памяти . - person Hojo.Timberwolf; 26.09.2018
comment
Я сделал то, что вы предложили, и это решило проблему. Это проблема буферизации. после захвата 5 дополнительных кадров я смог получить новый кадр. Это, однако, делает мой первоначальный вопрос более запутанным. Я не могу визуализировать кадры с помощью cv2.imshow, но похоже, что ничего не работает. очень запутанный - person Hojo.Timberwolf; 26.09.2018