我创建了一个简单的GUI来预览网络摄像头流并从中获取快照。为此,我创建了在轴上显示视频,一个按钮(按钮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'.
。为什么它会转换为double类型而不是子对象vidObj
?
我该如何修复它并获取快照?
还有其他更好的方法吗?
(我刚开始学习GUI。)
感谢。
答案 0 :(得分:2)
将全局声明变量的更好的替代方法是使用sharing data的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