Я хочу подключиться к камере и снимать кадр только тогда, когда происходит событие (например, нажатие клавиши). Упрощенная версия того, что я хотел бы сделать, такова:
cap = cv2.VideoCapture(device_id)
while True:
if event:
img = cap.read()
preprocess(img)
process(img)
cv.Waitkey(10)
Однако cap.read, похоже, захватывает только следующий кадр в очереди, а не последний. Я много искал в Интернете, и, кажется, есть много вопросов по этому поводу, но нет однозначного ответа. Только некоторые грязные хаки, которые включают открытие и закрытие устройства захвата непосредственно перед и после захвата (что не сработает для меня, так как мое событие может запускаться несколько раз в секунду); или предполагая фиксированную частоту кадров и считывая фиксированное n раз для каждого события (что не сработает для меня, поскольку мое событие непредсказуемо и может произойти с любым интервалом).
Хорошим решением будет:
while True:
if event:
while capture_has_frames:
img = cap.read()
preprocess(img)
process(img)
cv.Waitkey(10)
Но что такое capture_has_frames? Можно ли получить эту информацию? Я пытался заглянуть в CV_CAP_PROP_POS_FRAMES, но всегда -1.
На данный момент у меня есть отдельный поток, в котором захват выполняется с полной частотой кадров, и на моем мероприятии я беру последнее изображение из этого потока, но это кажется излишним.
(Я использую Ubuntu 16.04, кстати, но я думаю, это не имеет значения. Я также использую pyqtgraph для отображения)