Получение снимка с веб-камеры в Matlab

Я создал простой графический интерфейс для предварительного просмотра потока с веб-камеры и получения из него снимка. Для этого я создал оси для показа видео, одну кнопку (кнопка1) для запуска предварительного просмотра, одну кнопку (кнопка2) для получения снимка. Ниже приведен код для этих двух кнопок.

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes1);
vidObj = videoinput('winvideo',1);
videoRes = get(vidObj, 'VideoResolution');
numberOfBands = get(vidObj, 'NumberOfBands');
handleToImage = image( zeros([videoRes(2), videoRes(1), numberOfBands], 'uint8') );
preview(vidObj, handleToImage);


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
a=getsnapshot(get(axes,'Children'));
imshow(a);

В pushbutton2_Callback я пытаюсь получить дочерний элемент осей, т.е. vidObj. Но это дает мне ошибку ??? Undefined function or method 'getsnapshot' for input arguments of type 'double'.. Почему он возвращает двойной тип вместо дочернего объекта vidObj? Как я могу исправить это и получить снимок? Есть ли другой лучший способ? (Я только начал изучать графический интерфейс.) Спасибо.


person Harshveer Singh    schedule 27.05.2012    source источник
comment
Проблема решена путем объявления vidObj global.   -  person Harshveer Singh    schedule 27.05.2012
comment
Если у вас есть решение вашей проблемы, пожалуйста, ответьте на свой вопрос в ответе и примите его. Таким образом, другие пользователи смогут извлечь пользу из ответа, и вопрос будет правильно помечен как решенный. Спасибо!   -  person jpjacobs    schedule 27.05.2012


Ответы (1)


Лучшей альтернативой объявлению глобальных переменных является использование структуры handles для совместного использования. данные. GUIDE уже использует эту структуру для хранения дескрипторов всех компонентов GUI. Просто добавьте свои данные в качестве поля в эту структуру, которая будет передана всем функциям обратного вызова.

Итак, внутри первого обратного вызова:

function pushbutton1_Callback(hObject, eventdata, handles)
    %# ... your existing code ...

    %# store video object in handles, and persist
    handles.vidObj = vidObj;
    guidata(hObject,handles)
end

Затем во втором вы можете получить объект видео из структуры handles:

function pushbutton2_Callback(hObject, eventdata, handles)
    frame = getsnapshot(handles.vidObj);
    imshow(frame);
end
person Amro    schedule 09.06.2012