วันนี้ข้ามมาเขียนเรื่องนี้ก่อนครับ มีน้องท่านหนึ่ง เขามาฝากข้อความไว้ ว่าสนใจเรื่องการติดต่อ Web camera แล้วให้มาแสดงผลใน GUI ของ MATLAB ตัวผมก็ไม่เคยทำเอาละว้าจะเริ่มไงก่อนดีละเนี่ย
ปัจจุบันเทคโนโลยีด้านอิเล็กทรอนิกส์เจริญขึ้นอย่างรวดเร็ว ผลก็คือ เราก็มีเทคโนโลยีที่ดี และราคาถูกลง เช่นกันด้าน soft ware ก็มีการพัฒนาไปมาก เช่นโปรแกรมด้าน image processing ที่มีความสามารถหลากหลาย ก็แถมติดมากับแผ่น driver กล้อง web camera เลยก็ยังมี อีกทั้ง smart phone สมัยนี้มาแรงจริงๆครับ เทคโนโลยีของเขาถือว่าก้าวล้ำนำสมัย แต่ถ้าเรานั่งใช้นั่งรอเขาทำของใหม่ๆมาให้เราใช้ก็สะดวกอีกแบบครับ แต่ถ้าเราพอจะมีความรู้อยู่บ้าง และความต้องการด้าน soft ware ที่เฉพาะเจาะจง เพื่อให้เข้ากับงานของเรา การพัฒนาขึ้นใช้เองก็เป็นอีกทางออกหนึ่งครับ คิดเสียว่าเหมือนเราเขาโรงเรียนตอนเด็กยังไงทุกคนก็เริ่มจาก หัดท่องหัดเขียน (ก ข, a b c) เหมือนๆ กันครับ ไม่เป็นไรของแพงย่อมต้องดีอยู่แล้ว แต่ของที่ทำขึ้นเองก็ต้องดีในแบบฉบับของเราและแน่นอนมันภูใจครับ แต่หากท่านใดต้องการความสะดวกรวดเร็ว และมีกำลังทรัพย์ผมถือว่าเป็นความได้เปรียบอย่างหนึ่งครับ
กลับมาที่น้องเขาฝากข้อความไว้ (ไม่รู้จะกลับมาดูอีกไหม) ก็ประจวบเหมาะที่ผมเคยซื้อเจ้า webcam (Oker, web camera 177) มาไว้ใช้งานเก็บข้อมูลบางอย่าง ไว้นานแล้วเหมือนกัน ตอนนั้นผมใช้ soft ware ทั่วไปที่มีแจกกันใน cyber space ผมก็คิดไปคิดมา ว่าจะเริ่มยังไง เพราะไม่เคยทำมาก่อน สุดท้ายก็ลองมั่ว กันสักพักแต่ก็โชคดีที่หา key word ได้ถูกเลยค้นได้ง่ายหน่อย ผมค้นสองทาง ทางแรกใน internet และทางที่สอง MATLAB Help เว็บไซต์หนึ่งที่ผมเข้าไปดูและ ขอขอบคุณไว้ตรงนี้
Video & Image Acquisition using MATLAB
ก่อนอื่นผมใช้คำสั่งพวกนี้ครับ เพื่อตรวจสอบที่เกี่ยวกับข้อมูลวิดีโอ
>> imaqhwinfo('winvideo')
ans =
AdaptorDllName: [1x81 char]
AdaptorDllVersion: '3.2 (R2008b)'
AdaptorName: 'winvideo'
DeviceIDs: {[1] [2] [3]}
DeviceInfo: [1x3 struct]
ปรากฏว่าพบ Devices สามตัวด้วยกัน ผมก็ตรวจดูทีละตัวว่าตัวไหนกำกับด้วย DeviceID อะไร
ในที่นี้ Oker 177 กำหนดเป็นตัวที่ 2 ก็ลองตรวจดูรายละเอียด ก็อย่างที่เห็นด้านล่างเลยครับ
>> dev2=imaqhwinfo('winvideo',2)
dev2 =
DefaultFormat: 'RGB24_640x480'
DeviceFileSupported: 0
DeviceName: 'USB Video Device'
DeviceID: 2
ObjectConstructor: 'videoinput('winvideo', 2)'
SupportedFormats: {1x18 cell}
จากนั้นผมก็คำสั่ง videoinput เพื่อเตรียม video ให้กับ object ของเราในที่นี้ให้ชื่อว่า vid ส่วน winvideo
นั้นเป็นชื่อ adapter ที่ใช้ติดต่อกับ webcam ส่วนเลข 2 ก็เป็น device ID จากนั้นใช้คำสั่ง preview เพื่อแสดง video
>> vid=videoinput('winvideo',2);
>> preview(vid);
จากนั้นก็ลองทำ GUI ขึ้นมาหน้าตาประมาณนี้ จุดประสงค์ของ GUI นี้คือ แสดง video ที่รับมาจาก webcam สามารถ capture เป็นรูปภาพได้พร้อมจัดเก็บ มีชุดประมวลผลด้านภาพ หรือ วิดีโอ (คงต้องเพิ่มเติมทีหลัง ตอนนี้ยังไม่มีปัญหาที่ชัดเจนว่าจะเอาไปใช้แก้ปัญหาอะไร)
ในเบื้องต้นยังไม่ได้พัฒนาอะไรเลย แค่ติดต่อ webcam แล้ว capture ภาพนิ่งเท่านั้น เวอร์ชันต่อไปคงทำส่วนของ processing ครับ
สำหรับไฟล์ต่างที่แสดงในนี้ หากใครสนใจจะลองเอาไปเป็นแนวทางหรือเอาไปพัฒนาต่อ ตามลิ้งนี้เลย Download files>>>
webcam1
ในส่วนของคำสั่งที่จะปรากฏใน m-file มีรายละเอียดหลัก มีดังนี้
% --- Executes on button press in disconnect.
function disconnect_Callback(hObject, eventdata, handles)
% hObject handle to disconnect (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
closepreview
% --- Executes on button press in connect.
function connect_Callback(hObject, eventdata, handles)
% hObject handle to connect (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);
check1=get(handles.Camera1,'value');
check2=get(handles.Camera2,'value');
check3=get(handles.Camera3,'value');
if (check1==1)
obj=videoinput('winvideo',1);
elseif (check2==1)
obj=videoinput('winvideo',2);
else
obj=videoinput('winvideo',3);
end
vidRes = get(obj, 'VideoResolution'); % Resolution of device ex. 640x480
nBands = get(obj, 'NumberOfBands'); % number of channels ex. 3=RGB image
hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(obj, hImage);
handles.objVideo=obj;
guidata(hObject, handles);
% --- Executes on button press in capture.
function capture_Callback(hObject, eventdata, handles)
% hObject handle to capture (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
axes(handles.axes3);
im=getsnapshot(handles.objVideo);
handles.image=im;
imshow(handles.image);
%delete(handles.objVideo);% clear memory
guidata(hObject, handles);
% --- Executes on selection change in listbox1.
function listbox1_Callback(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
files = dir(fullfile(theFolder, '*.jpg'));
set(handles.listbox1, 'string', {files.name})
% Hints: contents = get(hObject,'String') returns listbox1 contents as cell array
% contents{get(hObject,'Value')} returns selected item from listbox1
% --- Executes during object creation, after setting all properties.
function listbox1_CreateFcn(hObject, eventdata, handles)
% hObject handle to listbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: listbox controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in save.
function save_Callback(hObject, eventdata, handles)
% hObject handle to save (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
%current_image=handles.image;
imsave
% --- Executes on button press in CloseWindow.
function CloseWindow_Callback(hObject, eventdata, handles)
% hObject handle to CloseWindow (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
close(ancestor(hObject,'figure'))
% --- Executes on button press in Camera1.
function Camera1_Callback(hObject, eventdata, handles)
% hObject handle to Camera1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of Camera1
% --- Executes on button press in Camera2.
function Camera2_Callback(hObject, eventdata, handles)
% hObject handle to Camera2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of Camera2
% --- Executes on button press in Camera3.
function Camera3_Callback(hObject, eventdata, handles)
% hObject handle to Camera3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of Camera3
% --- Executes on button press in processingUnit.
function processingUnit_Callback(hObject, eventdata, handles)
% hObject handle to processingUnit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
process_check=get(handles.processingUnit,'value');
if (process_check==1)
setappdata(0, 'cap_image', handles.image);% ?????????????????? handles.dataShow ????? test_data
ImagePro;
end% open externalTable GUI
% Hint: get(hObject,'Value') returns toggle state of processingUnit