Tuesday, July 24, 2012

Image processing & Mean square displacement (MSD) part IV (GUI MATLAB)

ขาดหายไปนานสำหรับหัวข้อนี้ ตอนแรกคิดไว้จะให้เสร็จสิ้นในตอนที่ 4 นี้แต่ทว่าตัวโปรแกรมยังไม่สมบูรณ์ครับ ด้วยเหตุผลที่ผมต้องไปทำงานหลักที่สำคัญกับชีวิตผม จึงจำเป็นที่ต้องเขียนทั้งๆที่มันไม่สมบูรณ์นี่แหละ ผมต้องย้อนไปสักนิด ว่าการหา MSD นั้นในที่นี้ผมจะใช้ โปรแกรม SpotTracker ซึ่งเป็น plug-in ของ ImageJ ในการหาตำแหน่งของอนุภาคที่เราสนใจจากนั้น เอาตำแหน่งมาคำนวนหา MSD โดยใช้ source code ที่ช่วยๆ กันเขียนขึ้นกับเพื่อนและรุ่นพี่สมัยเรียน แต่ผมจับมาใส่ใน GUI MATLAB

รูปร่างหน้าตาโปรแกรมก็จะประมาณนี้ ครับ


ตัวโปรแกรมจะถูกแบ่งหน้าที่การทำงานเป็น 3 ส่วน ได้แก่

1. ส่วน Image processing ส่วนนี้คงต้องเป็นโปรเจกยาว เพราะต้องการให้มีหน้าที่ ทำได้ทั้งรูปและวิดิโอ รวมไปถึง การทำ tracking ด้วย ตอนนี้เอาไว้แสดง วีดิโอและภาพเท่านั้น

2. ส่วนแสดง Random walk แบบ 2 มิติ

3. ส่วนการคำนวน ประกอบด้วย ส่วนแสดงเส้นทางการเคลื่อนที่ของอนุภาค (Trajectory), velocity correlation และการคำนวน MSD exponent

-หากเป็นตำแหน่งของ Random walk จาก simulation เมื่อเลือก MSD cal. check box โปรแกรมจะคำนวน MSD exponent ให้
-หากจะคำนวน MSD exponent ของอนุภาคต้อง load positions ที่ได้จาก SpotTracker เข้ามาก่อนถึงจะคำนวนได้

หัวข้อนี้เนื้อหาสั้นครับ แต่โปรแกรมยาวพอควร หากผมต้องการพักสมองจากงานหลักเมื่อใดคงจะมาพัฒนาส่วนที่ยังขาดครับ งานนี้ไม่ง่ายเลยสำหรับผม แต่เชื่อว่าสักวันต้องเสร็จ 555 !

ไฟล์ต่างเข้าไปโหลดในนี้ได้เลย ImageProMSD

Tuesday, July 3, 2012

How to interface webcam with MATLAB

    วันนี้ข้ามมาเขียนเรื่องนี้ก่อนครับ มีน้องท่านหนึ่ง เขามาฝากข้อความไว้ ว่าสนใจเรื่องการติดต่อ 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