Ana içeriğe atla

Matlab ile Kırmızı Mavi ve Yeşil Obje Takibi

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


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.

Kodlar:
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:

function varargout = rgb_takip_araci(varargin)
% 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

Bu blogdaki popüler yayınlar

Matlab Operatörler

Matematiksel operatörler: +  Toplama –  Çıkarma *  Çarpma /  Bölme ^  Üst alma .* Elemanter çarpım ./  Elemanter bölme .^  Elemanter üst alma a+b  Boyutları aynı olan a ve b matrisini toplar. a-b  Boyutları aynı olan a ve b matrislerinin farkını alır. a*b  Sütun sayısı m olan a matrisiyle satır sayısı m olan b matrisini çarpar. a/b  b düzenli kare bir matrisse (determinantı sıfırdan farklıysa), aynı boyutlu a matrisiyle; a*inv(b)işlemini yapar. a.*b  Boyutları aynı olan a ve b matrislerinin elemanlarını karşılıklı olarak çarpar. a./b  Boyutları aynı olan a ve b matrislerinin elemanlarını karşılıklı oranlar. sqrt  Kök alma abs  Mutlak değer rats  Kesirli gösterim Mantıksal operatörler: &  Ve |  Veya ~  Değil /  Bölme Karar operatörleri: >  Büyüktür <  Küçüktür >=  Büyük eşittir <=  Küçük eşittir ==  Eşittir ~=  Eşit değildir

Matlab Random Sayı Üretme

randi() Matlab üzerinde random sayı üretmek için en iyi komut randi() 'dir. rand() fonksiyonu ya da komutu ile de random sayı üretilebilir. Bu yazıda randi() komutunu anlatacağım ve yazının sonundaki link ile birbirinden farklı en tane sayı üretme algoritmasını paylaşacağım. Önemli: Bu sayfadaki matlab fonksiyonları ve açıklamaları matlabın orjinal sayfasından edinilmiştir. https://www.mathworks.com/help/matlab/ref/randi.html Örnek: randi(10,5) > 1'den 10'a kadar 5x5'lik bir random sayı matrisi üret. r = randi(10,5) %matlab komutu r = 5×5 9 1 2 2 7 10 3 10 5 1 2 6 10 10 9 10 10 5 8 10 7 10 9 10 7 Örnek:  randi ([-5,5],10,1) > -5'den başlayıp 5'e kadar 10 satır ve 1 sütuna sahip 10x1'lik bir randım sayı matrisi oluturur. "1" değiştirilerek başka boyutlarda da matris oluşturulabilir. r = randi([-5,