Sunday, March 18, 2012

Open a file from folder (GUI MATLAB)

วันนี้ผมจะนำเรื่องการเปิดไฟล์รูปจากโฟลเดอร์ที่เก็บรูปไว้ แล้วนำมาแสดงบน GUI ที่สร้างขึ้นมา

เริ่มต้นที่ command window MATLAB
พิมพ์ตามด้านล่างเพื่อเรียก GUI design environment (GUIDE) tools ขึ้นมาใช้งานครับ

>>guide

จะปรากฎ GUIDE Quick Start ---> Blank GUI (default) ---> OK


จากนั้นเลือก สร้าง Push button เพื่อสร้างปุ่มกด และ Axes เพื่อรองรับรูปที่จะเปิดมาแสดง


พร้อมกับ บันทึกเป็นชื่อ OpenImage.fig ขณะเดียว MATLAB ก็สร้าง m-file ขึ้นมาให้เราโดยอัตโนมัติ m-file นี้เองที่เราจะต้องไปแก้ไขเพิ่มเติม source code ให้โปรแกรมทำงานตามที่เราต้องการ โปรแกรมที่สร้างขึ้นก็มีรูปร่างหน้าตาประมาณนี้ครับ




ผมเพิ่มเติมส่วนการแก้ไข คุณสมบัติของ components ต่างๆ คลิ๊กขวาแล้วเลือก Property Inspector ครับ จากนั้นก็แก้ไขตามสะดวกครับ แต่ในที่นี้จะเน้นหลักที่จำเป็นครับ ได้แก่
- string จะเป็นตัวอักษรที่แสดงบน GUI ที่เราสร้างขึ้นควรเป็น คำหรือข้อความเพื่อสื่อความหมายถึงหน้าที่ของเครื่องมือนั้นๆ
- Tag จะระบุชื่อของ component นั้น ซึ่งจะปรากฎใน source code (แนะนำว่าให้ตั้งชื่อที่สอดคล้องกับ string เพื่อความง่ายแก่การจำ เผื่อว่าเรามี components เยอะๆ)

ลองสังเกตจากรูปด้านล่างนะครับ


พอกดปุ่ม Run figure (ปุ่มสามเหลี่ยมสีเขียวด้านบน) ก็จะได้โปรแกรมประมาณนี้เลยครับ


แต่โปรแกรมยังทำอะไรไม่ได้ เราต้องไปเพิ่ม code ก่อนครับ



ผมขอยกมาเฉพาะส่วนที่ต้องเพิ่มเติมเท่านั้นครับ เราจะแก้ไขเฉพาะส่วน function callback เท่านั้นครับ ไฟล์เต็มๆโหลดตรงนี้้เลยครับ ===> OpenImage.fig, OpenImage.m


% --- Executes on button press in pushOpen.
function pushOpen_Callback(hObject, eventdata, handles)
% hObject handle to pushOpen (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[F,PathName,FilterIndex] = uigetfile({'*.*','All Files(*.*)'}, 'Select your File ');
input=strcat(PathName,F);
RGBimage=importdata(input); % เก็บรูปไว้ในตัวแปลชื่อ RGBimage
axes(handles.axes1); % ต้องระบุ axes ให้ด้วยว่าจะแสดงตรงไหน
imshow(RGBimage); % เป็นฟังก์ชันการแสดงรูปครับใน MATLAB ครับ
hpixinfo = impixelinfo; % บอก ตำแหน่งที่เม้าท์ชี้ พร้อมค่า R, G และ B ประจำ pixel นั้นๆ
zoom on;
axis off;
guidata(hObject,handles);


% --- Executes during object creation, after setting all properties.
function axes1_CreateFcn(hObject, eventdata, handles)
% hObject handle to axes1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called

% ฟังก์ชันนี้ต้องสร้างขึ้นเองครับ โดยไปที่ OpenImage.fig คลิ๊กขวาที่ axes1
% เลือก View Callbacks --> CreateFcn จะได้ code ในส่วนนี้ขึ้นมาแต่ไม่ต้องทำอะไร
% Hint: place code in OpeningFcn to populate axes1



% --- Executes on button press in pushExit.
function pushExit_Callback(hObject, eventdata, handles)
% hObject handle to pushExit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
button = questdlg('Do you want to quit?', ...
'Exit Dialog','Yes','No','No');
switch button
case 'Yes',
disp('Exit RGB SpecAnal');
%Save variables to matlab.mat
save
close(ancestor(hObject,'figure'))
case 'No',
quit cancel;
end


หน้าตาโปรแกรมที่สามารถทำงานได้เป็นแบบนี้ครับ และครั้งต่อไปผมจะแยกแสดงสีของรูป แล้วแสดงที่ละสีครับได้แก่ Red, Green and Blue หรือรูปแบบสีเทา (gray scale image)





5 comments:

  1. ขอบคุณค่ะ รออ่านเพิ่มเติมอยู่นะ

    ReplyDelete
  2. ขอคำแนะนำเรื่อง image processing ด้วยนะคะ คือยากรุ้เรื่อง การติดต่อกับกล้องเว็บแคม แล้วนำภาพที่ได้มาแสดงบน GUI

    ReplyDelete
    Replies
    1. เบื้องต้นลองเข้าไปดูในนี้ก่อนนะครับ
      เป็นของอาจารย์ท่านหนึ่ง มีรายละเอียดอยู่ครับ
      http://www.researchers.in.th/blogs/posts/4284

      แล้วยังไงผมลองดู แล้วจะมาโพส อีกครั้งครับ

      Delete
    2. ผมลองใช้คำสั่งพวกนี้ดูครับ

      >>imaqhwinfo('winvideo') % ใช้คำสั่งนี้ตรวจสอบว่ามีกล้องต่อกับ com เรากี่ตัว จะใช้ตัวไหนได้บ้าง
      ans =

      AdaptorDllName: [1x81 char]
      AdaptorDllVersion: '3.2 (R2008b)'
      AdaptorName: 'winvideo'
      DeviceIDs: {[1] [2] [3]}
      DeviceInfo: [1x3 struct]
      >> vid=videoinput('winvideo',2);% ผมเลยเลือกใช้ Device2 ครับซึ่งเป็น webcam oker 177 ที่ต่อเอาไว้แล้ว
      >> preview(vid);

      ผมลองทำให้มาอยู่ใน GUI ดู (แต่ยังไม่สมบูรณ์ ลองเอาไปพัฒนาต่อดูครับ) ตามลิ้งด้านล่างเลย
      http://www.mediafire.com/?b67e4zya6bz3mwu,b5y82775xyg9zx5,pyamqr83nhsr0z7,fi4t6f6098bv5w5

      Delete
  3. โหลดไม่ได้คับ

    ReplyDelete