2015-01-09 2 views
0

Я пытаюсь захватить изображение с камеры и сохранить его. Я буду делать некоторые вычисления между ними, но для целей вопроса я не являюсь. (т.е. прокомментирована строка ниже doStuff())Почему opencv сохраняет одно и то же изображение?

Проблема в том, что я всегда сохраняю одно и то же изображение, и я не понимаю, почему. Кажется, я не смываю буфер памяти или что-то подобное?

Я пробовал пример from the docs, и он отлично работал. Кроме того, в реальной реализации getFrame определяется в другом файле и импортируется, но я не думаю, что это должно иметь значение.

Любой помощь оценила

import cv2 
import time, datetime 

def getFrame(cap, fn='image'): 
    timeString = datetime.datetime.fromtimestamp(time.time()).strftime('%H_%M_%S_%Y_%m_%d') 
    readSuccess, frame = cap.read() 
    pn = os.getcwd() + '/Images/' 
    if readSuccess: 
     cv2.imwrite(pn+fn+'_'+timeString+'.png', frame) 

cap = cv2.VideoCapture(0) 
for ii in range(10): 
    doStuff() # this doesn't really matter, I'm testing it with this line commented 
    getFrame(cap) # <- this always saves the same image 

EDIT

После немного больше испытаний:

Это на самом деле не захватывая то же изображение, но это, кажется, следующих изображения , К следующему я имею в виду, что если вы считаете, что это живой поток, он просто переходит к следующему изображению, которое было бы захвачено, чтобы сделать его более ясным:

Если у него есть 10 буферов изображений, например, .read запущен, он захватывает 10 изображений, расположенных близко друг от друга. Поэтому, когда я делаю следующую команду .read, она просто возвращает ранее записанное изображение и добавляет его в буфер. Я делаю здесь небольшую работу, но я думаю, что это то, что происходит. Это объясняет, почему пример из документов выше работает отлично, и все это имеет смысл в отношении вещей, которые вы хотели бы получить в случае прямого потока, но не в моем случае.

Кто-нибудь видел это поведение раньше? Обходной путь?

EDIT2

Я вставил следующий код:

for ii in range(10): 
    cap.grab() 

сразу после линии def getFrame(cap, fn='image'): и считает работу, однако я dubmstruck на это и до сих пор не совсем понимаю. Я надеюсь, что у кого-то есть (a) лучшее решение и (б) может быть, фактическое объяснение, а не мои ожидания.

Спасибо!

+0

Являются ли _все_ изображения одинаковыми, если вы захватываете в течение длительного периода времени (много секунд) или если вы добавляете длинную паузу между захватами? Возможно, камера еще не успела взять еще один кадр за то время, когда вы можете сохранить 10 изображений в файл. – 101

+0

они все одинаковые ... даже если я просто делаю это вручную, то есть я определяю 'getFrame', а затем просто набираю' getFrame (cap) 'в терминале и жду, чтобы увидеть изображение, а затем повторить его, это то же самое , Имеет ли это смысл? – evan54

+0

ok Я попробовал еще раз, но теперь я печатаю фрейм, мне кажется, что вместо захвата текущего кадра есть какой-то буфер, потому что чем быстрее я делаю 'getFrame (cap)', тем он точнее. Это самое сумасшедшее поведение, которое я когда-либо видел. Кроме того, очень странно, что пример из документов, которые я перечислил, отлично работает ** в реальном времени ** – evan54

ответ

0

Похоже мой guestimating был прав, я нашел эту link с этим answer где испытывали те же проблемы и подобная «взломать» был использован как предложено в моем edit2.

Если у меня есть время, я улучшу ответ, я думаю, что постоянное чтение изображений и сохранение только тех, которые я хочу, - лучшее решение, которое я напишу, если у меня будет время.

Смежные вопросы