Matlab ile Kırmızı Mavi ve Yeşil Obje Takibi
Obje takip aracını gui ortamında yapmak istiyorum. Yapacağım işlemleri adım adım anlatmak istiyorum.
Dosyaları indirmek için tıklayınız
Dosyaları indirmek için tıklayınız
1. Adım: Gui ortamına geçmek için fotografta görünen kısma (command windowa) guide yazınız daha sonra enter a basınız karşımıza GUIDE Quick Start menüsünden OK butonuna basınız.
2. Adım: Ok butonuna basıldıktan sonra fotograftaki guide arayüzü karşımıza gelmektedir.
3. Adım: Karşımıza gelen arayüzün sol tarafında bulunan nesnelerden, push button, pop-up menu, text ve axes nesnelerine ihtiyacımız var. Axes nesnesinde telefondan aldıgımız videoyu görüntüleyecegiz. Text nesnesinde ise debug işlemi yapacagız.
4. Adım: Nesnelerimizi üzerlerine tılayarak ızgaranın üzerine bırakalım ve boyutlarınında degişiklik yapalım. Nesneleri benim konumlandırdıgım şekilde konumlandırınız.
Görüntü işleme yaparken işlenen görüntüyü ne kadar küçük görüntülersek verimlilik artar. Eger videoyu görüntülerken çok büyük yaparsanız sisteminiz de daha fazla geçikme görülür.
5. Adım: Nesnelere ikişer defa tıklayarak açılan properties menusünden renklerini, yazı büyüklügünü ve yazılarını degiştiriyorum.
Backgroundcolor ile arkaplan rengini,
Fontsize ile yazı büyüklügünü,
Fontwight ile yazı kalınlıgını,
ForeGroundcolor ile yazı rengini,
String ile buton yazısını degiştirdim.
Sizde bu adımları izleyerek istediginiz arayüzü tasarlayabilirsiniz.
6. Adım: Bu adımda pop-up menu kullanımını anlatacagım. Yani açılır menüye nasıl birden fazla yazı ekleyecegimizi anlatacagım. Pop-up menu ile sürekli yazılıma giderek com baglantısının yerini degiştirmemize gerek yok. Pop-up a tıklayarak, arduino hangi prottaysa o portu işaretlememiz yeterli oluyor.
İşlemleri anlatayım; pop-up a iki defa tıkladım açılan properties yani özellikler menüsünden kara içerisinde ki ikona tıkladım ve açılan String menüsünün içine com 5, com 6 ve com 4 yazdım.
6. Adım: Konuya baya ilerlemişken hata yaptıgımı farkettim. Birden fazla rek takibi yapacagız ama hangi rengi takip edecegimizi belirleyen bir pop-up menu oluşturmadım. Hemen fotoda ki gibi araya sıkıştırıyorum bi tane.
ÖNEMLİ BRİFİNGİ OKUYUNUZ!!!
Arayüz tasarımımız bitmiştir gelelim kodları yazmaya. Önce arduinonun hangi portta oldugunu belirleyecek olan pop-up1'in kodlarını yazalım. Daha sonra arduinoya baglanmak için oluşturdugum BAGLAN butonunun kodlarını, arduino debug işlemi için gerekli static text4'ün kodlarını ve renk takibinde hangi rengi takip edecegimizi belirlemek adına pop-up2'nin kodlarını yazalım en son görüntü işleme kodlarını yazalım.
7. ADIM: Bu adım da pop-up menu kullanımını anltacagım. Pop-up a sag tıklayarak wiev callbaks sekmesinden calback e tıklayınız.
Kodlar:
sira = get(hObject,'Value');global com;
if sira==1
com='COM5';
elseif sira==2
com='COM6';
elseif sira==3
com='COM7';
end
8. ADIM: Baglan butonu ile arduinoya baglancagız ve durumu static text'e yazdıracagız.
Kodlar:
global com;global arduinouno;
arduinouno=arduino(com,'Uno');
set(handles.text4,'String','Baglantı Kuruldu');
GLOBAL NEDİR ?
Normalde nesneler arasında degişken paylaşımı yoktur bunu saglamak amacıyla bir degişken global tanımlanırsa ve başka bir nesnede de aynı degişken global tanımlanırsa, iki nesne arasında degişken kullanılabilir hala gelir.
9. ADIM: Takip etmek istedigimiz rengi belirlemek için pop-up ikiden seçim yapacagız. Yazacagım kodlar anlamlı gelmeyebilir, görüntü işleme kısmında anlayacaksınızdır.
renk degişkenine takip edecegimiz renk kodunu atatık.
sira = get(hObject,'Value');
global renk;
if sira==1
renk=1;
elseif sira==2
renk=2;
elseif sira==3
renk=3;
end
10. ADIM: GÖRÜNTÜ İŞLEME
Bu adımı kodlar üzerinden anlatmak istiyorum.
Kodlar:
% RGB_TAKIP_ARACI MATLAB code for rgb_takip_araci.fig
% RGB_TAKIP_ARACI, by itself, creates a new RGB_TAKIP_ARACI or raises the existing
% singleton*.
%
% H = RGB_TAKIP_ARACI returns the handle to a new RGB_TAKIP_ARACI or the handle to
% the existing singleton*.
%
% RGB_TAKIP_ARACI('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in RGB_TAKIP_ARACI.M with the given input arguments.
%
% RGB_TAKIP_ARACI('Property','Value',...) creates a new RGB_TAKIP_ARACI or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before rgb_takip_araci_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to rgb_takip_araci_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help rgb_takip_araci
% Last Modified by GUIDE v2.5 14-Sep-2017 18:19:20
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @rgb_takip_araci_OpeningFcn, ...
'gui_OutputFcn', @rgb_takip_araci_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before rgb_takip_araci is made visible.
function rgb_takip_araci_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to rgb_takip_araci (see VARARGIN)
% Choose default command line output for rgb_takip_araci
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes rgb_takip_araci wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = rgb_takip_araci_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
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)
global arduinouno;
global renk;
axes(handles.axes1) %axes te görünütleme yapabilmek için özelliklerine erişim saglıyoruz
while 1
cam=ipcam('http://192.168.43.1:8080/videofeed', '', '', 'Timeout', 300);
img = snapshot(cam);
i=1;
yesil=0;
y=img(:,:,renk); %görüntünün rgb katmanlarından birisi çıkartılıyor
grayimg=rgb2gray(img); %görüntü griye çevrilir
imsubt = imsubtract(y, grayimg); %y den grayimg çıkartılıyor
medfilt = medfilt2(imsubt, [3 3]); %3 e 3 lük bir filtre uygulanır
level=graythresh(medfilt); %filtrenin parlaklık degeri belirlenir
bw = im2bw(medfilt,level); %level degerine göre görüntü siyah ve beyaz px lere dönüştürülür
bw = bwareaopen(bw,100); %görüntüde ki 100 px den bagımsız nesneler silinir
se=strel('disk',5); %Yarıçapı 10px olan disk biçiminde yapısal element oluşturuyoruz
bw=imclose(bw,se); %Yapısal element yardımıyla iç kısımdaki boşluklar kayboldu
bw=imfill(bw,'holes'); %Resimde çukur diye nitelendirilen yerleri dolduruyoruz
bw2 = bwlabel(bw, 8); %bunu bilmiyorum
stats = regionprops(bw2, 'BoundingBox', 'Centroid'); %bw2 görüntüsünde ki nesnelerin özellikleri %stats'a atanıyor
[satir,sutun]=size(bw2); %fotograflara dönüştürülmüş resmimizin genişligini ve yüksekligini %hesaplıyorum
imshow(img);
for object2 = 1:length(stats) %rgb için yapılan işlemler
boundingBox{object2} = stats(object2).BoundingBox; % Objeyi çevreleyen dikdörtgenin %koordinatları
bb = stats(object2).BoundingBox; %cismin özellikleri bb ye atanıyor
rectangle('Position',bb,'EdgeColor','r','LineWidth',2); %cismin etrafına dikdörtgen cizdiriliyor
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x_left = boundingBox{object2}(1); %objenin sol üst köşesinin x degerini alır
y_left = boundingBox{object2}(2); %objenin sol üst köşesinin y degerini alır
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cent = stats(object2).Centroid; %cismin merkez noktasının koordinat bilgilerini cent degişkenine %atar
x_cent=cent(1); %cent degişkeninde ki x koordinat bilgisini x1 e atar
y_cent=cent(2); %cent degişkeninde ki y koordinat bilgisini y1 e atar
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%aracımız ekrandaki nesnenin genişligine göre hareket edecegi için
%nesnenin x ve y genişliklerini hesaplattıracagız
x=2*(x_cent-x_left);
y=2*(y_cent-y_left);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%
% % %
% % %
% 1. bölge % 2. bölge %
% % %
% % %
%%%%%% merkez %%%%%%%
% % %
% % %
% 3. bölge % 4. bölge %
% % %
% % %
%%%%%%%%%%%%%%%%%
%nesnenin ekrandaki büyüklügüne göre aracımızı hareket ettirecegiz.
if x>26 || y>26 %nesnenin kenar büyüklüklerinden 1 tanesi
%26 px'lden büyükse araç hareket algoritması
%çalışacak
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if x_cent<satir/2 && y_cent<sutun/2 %rgb obje 1. bölgede bulunuyorsa
if y_cent<sutun/2 %arac önce ileriye gidecek
writeDigitalPin(arduinouno,'D4',1);
writeDigitalPin(arduinouno,'D6',1);
writeDigitalPin(arduinouno,'D8',1);
writeDigitalPin(arduinouno,'D10',1);
set(handles.text2,'String','ileri');
end
if x_cent<satir/2 %arac sola dönecek
writeDigitalPin(arduinouno,'D5',1);
writeDigitalPin(arduinouno,'D7',1);
writeDigitalPin(arduinouno,'D8',1);
writeDigitalPin(arduinouno,'D10',1);
set(handles.text2,'String','sol dön.');
end
end %obje 1. bölgede bulunuyordu, şimdi merkeze yerleşti
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if x_cent>satir/2 && y_cent<sutun/2 %rgb obje 2. bölgede bulunuyorsa
if y_cent<sutun/2 %arac önce ileriye gidecek
writeDigitalPin(arduinouno,'D4',1);
writeDigitalPin(arduinouno,'D6',1);
writeDigitalPin(arduinouno,'D8',1);
writeDigitalPin(arduinouno,'D10',1);
set(handles.text2,'String','ileri');
end
if x_cent>satir/2 %arac saga dönecek
writeDigitalPin(arduinouno,'D4',1);
writeDigitalPin(arduinouno,'D6',1);
writeDigitalPin(arduinouno,'D9',1);
writeDigitalPin(arduinouno,'D11',1);
set(handles.text2,'String','saga dön.');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if x_cent<satir/2 && y_cent>sutun/2 %rgb obje 3. bölgede bulunuyorsa
if y_cent>sutun/2 %arac geriye gidecek
writeDigitalPin(arduinouno,'D5',1);
writeDigitalPin(arduinouno,'D7',1);
writeDigitalPin(arduinouno,'D9',1);
writeDigitalPin(arduinouno,'D11',1);
set(handles.text2,'String','geri');
end
if x_cent<satir/2 %arac sola dönecek
writeDigitalPin(arduinouno,'D5',1);
writeDigitalPin(arduinouno,'D7',1);
writeDigitalPin(arduinouno,'D8',1);
writeDigitalPin(arduinouno,'D10',1);
set(handles.text2,'String','sola dön.');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if x_cent>satir/2 && y_cent>sutun/2 %rgb obje 4. bölgede bulunuyorsa
if y_cent>sutun/2 %arac geriye gidecek
writeDigitalPin(arduinouno,'D5',1);
writeDigitalPin(arduinouno,'D7',1);
writeDigitalPin(arduinouno,'D9',1);
writeDigitalPin(arduinouno,'D11',1);
set(handles.text2,'String','geri');
end
if x_cent>satir/2 %arac saga dönecek
writeDigitalPin(arduinouno,'D4',1);
writeDigitalPin(arduinouno,'D6',1);
writeDigitalPin(arduinouno,'D9',1);
writeDigitalPin(arduinouno,'D11',1);
set(handles.text2,'String','saga dön.');
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%AŞAGIDA ARACIN MOTOR BAGLANTILARINI GÖSTERDİM
%%%%%%%%%%%%%%%%%%
% %
%% %%
%% 1. SOL MOTOR %% 1. SAG MOTOR
%% D4 İLERİ BAGLANTISI %% D8 İLERİ BAGLANTISI
%% D5 GERİ BAGLANTISI %% D9 GERİ BAGLANTISI
%% %%
%% %%
% %
% %
% %
% %
% %
% %
% %
% %
% %
% %
%% %%
%% 2.SOL MOTOR %% 2. SOL MOTOR
%% D6 İLERİ BAGLANTISI %% D10 İLERİ BAGLANTISI
%% D7 GERİ BAGLANTISI %% D11 GERİ BAGLANTISI
%% %%
%% %%
% %
%%%%%%%%%%%%%%%%%%%
end
end
% --- 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)
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu1
sira = get(hObject,'Value');
global com;
if sira==1
com='COM5';
elseif sira==2
com='COM6';
elseif sira==3
com='COM7';
end
% --- Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu 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 pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global com;
global arduinouno;
arduinouno=arduino(com,'Uno');
set(handles.text4,'String','Baglantı Kuruldu');
% --- Executes on selection change in popupmenu4.
function popupmenu4_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu4 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu4
sira = get(hObject,'Value');
global renk;
if sira==1
renk=1;
elseif sira==2
renk=2;
elseif sira==3
renk=3;
end
% --- Executes during object creation, after setting all properties.
function popupmenu4_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu 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
Yorumlar
Yorum Gönder