Bilgisayar
OKUDUĞUNUZ KONU
Görüntü İşleme Yöntemleri İle İnsan Sayma
6

Görüntü İşleme Yöntemleri İle İnsan Sayma

Yazar : Murat Duran26 Temmuz 2015

Matlab mühendislik uygulamalarında en çok kullanılan programla tabanlı bir uygulamadır.Her geçen gün yenilenen matlab kendi içinde yüksek işlevselliğe sahip uygulamalarda barındırmaktadır.Bunlardan biriside görüntü işleme teknolojisidir.Son yıllarda popülerliği artan görüntü işleme teknolojisinin kullanım alanı neredeyse sınırdır diyebiliriz.

Bu projemizde de basit bir Görüntü İşleme yapacağız.Aşağıdaki kod parçacığında videoyu işaretçiye nasıl gösterildiğini anlayabilirsiniz.


%% Loading
clear all;
%Read from File
xyloObj = mmreader('pc.avi');
tic % start timing
nFrames =xyloObj.NumberOfFrames;

speed=1; %Define Frame rate.
limit=nFrames/speed;

%Load Video to variables as Red Green Blue
for k = 1:speed:nFrames
 ex = read(xyloObj,k);
 tempRgbObj(:,:,:,int16(k/speed)+1) = ex(:,:,:);
end;

Videodaki süreklilik aslında nasıl sağlanmaktadır.Bir adet statik listede tespit ettiğimiz insanların merkez koordinatlarını, hızını, giriş kapısını, boyutunu ve sınırlarını aldık. Bu listede her bir görüntü karesi için ekleme, çıkarma ve güncellemeler yaptık.Aşağıdaki kodda “image open” ve “mage close” atamaları mevcuttur.


%%Filtering
 curBW=0; % current black white frame
 for j=1:2 % do 'or' between two frames which is next to other one
 k=u+j-1;
 bw3=0;
 subs3=0;
 curRGB = tempRgbObj(:,:,:, k);% current red green blue frame

for i=1:3 % for each color (red green blue) do substraction
 C=curRGB(:,:,i);
 subs=imabsdiff(background(:,:,i),C);
 subs3=subs3+subs;
 bw=subs>30; % thresholding
 bw=imclose(bw,disk1);
 bw3=bw3+bw; % and sum up of them
 end
 bw3=(bw3~=0);
 bw3=imclose(bw3,disk3);
 bw3=imopen(bw3,disk2);
 curBW=curBW+bw3; % do 'or' between two frames
 curBW=(curBW~=0); % convert to binary
 end
 curBW(:,(1:75))=0; % erase noise which is at left of frame
%% Calculating.
tic
background = tempRgbObj(:,:,:, 400);
disk1 = strel('disk',3); % Create Disks
disk3 = strel('disk',8); % Create Disks
disk2 = strel('square',12); % Create Disks
sum_Up=0;
sum_Down=0;
List=[];

Bundan sonraki işlemlerde her bir görüntü karesinde döngü uygulamamız gerekmekte.Döngü için kullandığımız kod parçası.

for u =1:2:nFrames

 

 

Filtreleme sistemi arka plan çıkarma metoduyla gerçekleştirildi.Bir eşik değeri belirledik ve incelediğimiz görüntüdeki her bir piksele bu eşik değerinden büyük ise 1, küçük ise 0 vererek ikili formatta görüntü elde ettik. Bundan sonra “image open” ve “image close” işlemleri yaptık.


%%Filtering
 curBW=0; % current black white frame
 for j=1:2 % do 'or' between two frames which is next to other one
 k=u+j-1;
 bw3=0;
 subs3=0;
 curRGB = tempRgbObj(:,:,:, k);% current red green blue frame

for i=1:3 % for each color (red green blue) do substraction
 C=curRGB(:,:,i);
 subs=imabsdiff(background(:,:,i),C);
 subs3=subs3+subs;
 bw=subs>30; % thresholding
 bw=imclose(bw,disk1);
 bw3=bw3+bw; % and sum up of them
 end
 bw3=(bw3~=0);
 bw3=imclose(bw3,disk3);
 bw3=imopen(bw3,disk2);
 curBW=curBW+bw3; % do 'or' between two frames
 curBW=(curBW~=0); % convert to binary
 end
 curBW(:,(1:75))=0; % erase noise which is at left of frame

Aşağıdaki kodda ara ve yok metodu uygulandı.Metot siyah beyaz olarak filtrelenen resimdeki nesnelerin merkezlerini bulacağız.

%% Search and Destroy

[r,c] = size(List);
 [L,n] = bwlabel(curBW); %labeling frame

for i=1:n
 [row,col]=find(L==i);
 if size(row)<1000
 curBW=curBW-(L==i);
 end
 end

Bu kodda boyut taraması yapıldı ve belli bir boyuttan küçük nesnelerin yok sayılması sağlandı.Çok küçük nesnelerin bizim için önemi yoktur.


[L,n] = bwlabel(curBW); %labeling frame without small objects

i=1;
 while i<=c
 o=List(i);
 x=o.posX+o.hizX; %predicted X
 y=o.posY+o.hizY; %predicted Y
 [isFound,yeniX,yeniY] = search(curBW,floor(x),floor(y));
 if isFound==1
 [rows,cols] = find (L==L(yeniX,yeniY));
 merX=ceil(mean(rows)); % new X
 merY=ceil(mean(cols)); % new Y

% if it change its region
 if o.giris==1 && merX>144
 sum_Down=sum_Down+1;
 o.giris=2;
 else if o.giris==2 && merX<144
 sum_Up=sum_Up+1;
 o.giris=1;
 end
 end

object = struct('posX',merX,'posY',merY,'hizX',merX-o.posX,'hizY',merY-o.posY,'giris',o.giris,'matris',(L==L(yeniX,yeniY)));
 List(i)=object; % update the list with new parameters
 curBW=curBW-object.matris; %Remove it from the current bw frame
 else
 List(i)=[]; % Remove from list if you can not find
 c=c-1;
 end
 i=i+1;
 end

Arama algoritmasında girdilerimiz Matris ve aramaya başlama noktalarıdır. Matris üzerinde bu noktalardan başlayarak belli bir sınırda spiral çizerek arama işlemi yaptık. Bu sınırlar içerisinde şayet bir cisim tespit edilirse, tespit ettiği noktaları geri döndürdük. Spiral şeklinde arama yaptırabilmek için matematiksel olarak t nin düzenli arttığı bir döngüde

x=ceil(t*cos(t)/10+a);
y=ceil(t*sin(t)/10+b);

formüllerini kullandık. Ayrı bir fonksiyon şeklinde tanımlanan kodun tamamı ise şu şekildedir:


function[ buldumu,x,y ] =search( Matris,a,b )
%FİND Summary of this function goes here
% Detailed explanation goes here

[r,c]=size(Matris);
for t=1:20 % Search by spiral
 x=ceil(t*cos(t)/10+a);
 y=ceil(t*sin(t)/10+b);
 if x<=r && y<=c && x>0 && y>0
 if Matris(x,y)==1
 buldumu=1;
 return;
 end
 end
end
buldumu=0;
end

İncelediğimiz renkli görüntü karesini ikili kareye çevirmiştik. Listeye eklenecek elemanları bu ikili kare üzerinde yapacağımız işlemlerle bulacağız. Öncelikle üzerinde çalıştığımız ikili karemizi bwlabel fonksiyonuna parametre olarak veriyoruz.
[L,n] = bwlabel(curBW);


for i=1:n
 [r,c]=find(L==i); % find areas which are white group, give a number and assign L
 if length(r) > 1500
 x=ceil(mean(r)); %find x coordinate of center of object
 y=ceil(mean(c)); %find y coordinate of center of object
 objmatrix=(L==i);

if x<144 % object is going from up to down
 giris=1;
 else % object is going from down to up
 giris=2;
 end
 object = struct('posX',x,'posY',y,'hizX',0,'hizY',0,'giris',giris,'matris' ,objmatrix);
 List = [List object];
 end
 end

Eğer x, görüntü karemizin satır boyutunun yarı değeri olan 144’ten büyük ise nesne aşağı taraftan giriş yapmış ve yukarıya yönelmektedir. 144’ten küçük ise nesne yukarı taraftan giriş yapmış ve aşağıya yönelmektedir. Nesnenin hızı ise nesne yeni oluştuğu için sıfırdır. Tüm bu özellikleri belirledikten sonra:
object = struct(‘posX’,x,’posY’,y,’hizX’,0,’hizY’,0,’giris’,giris,’matris’ ,objmatrix);
List = [List object];
Komutları ile yeni nesne oluşturma ve listeye ekleme işlemlerini bitirmiş olduk.


[row,col] = size(List);

%for red dots
 for i=1:col
 o=List(i);
 curRGB((o.posX-3:o.posX+3),(o.posY-3:o.posY+3),1)=255;
 curRGB((o.posX-3:o.posX+3),(o.posY-3:o.posY+3),2)=0;
 curRGB((o.posX-3:o.posX+3),(o.posY-3:o.posY+3),3)=0;
 end
 curRGB(144,:,3)=255;
 curRGB(144,:,2)=0;
 curRGB(144,:,1)=0;
figure(1),text(5,134,strcat('Up:',int2str(sum_Up)),'color','yellow','fontsize',11,'fontweight','bold');
 figure(1),text(5,155,strcat('Down:',int2str(sum_Down)),'color','yellow','fontsize',11,'fontweight','bold');
 figure(1),imshow(curRGB); %the
end

Burada ise figür 1 üzerine ekranın solunda, çizginin alt ve üstüne, geçiş için sayaçların tuttuğu değer yazılmaktadır ve son olarak çıktı ekranda gösterilmektedir.

Malum şu an bir döngü içerisindeyiz, her bir ekran görüntüsü için yukarıda birçok işlem yaptık ve sonucu ekrana bastırdık. Şimdi döngümüzü kapatıyoruz ve bir sonraki ekran görüntümüzü almak için başa dönüyoruz.

Kaynak : Barış Geçer , Ebubekir Güler

SİZCE NASIL OLMUŞ?
Beğendim
60%
İlginç
25%
Eh İşte
0%
Anlamadım
10%
Kötü
0%
Berbat
5%
YAZAR HAKKINDA
Murat Duran
Murat Duran
Açık kaynak donanım ve yazılım geliştiricisiyim , mekanik ve robotik sistemler üzerinde çalışmalar yapmaktayım.Ayrıca bir start-up firması olan Proje Hocam 'ın kurucuyum.
6 YORUMLAR
  • dizi ara
    26 Temmuz 2015 at 12:41

    gerçekten dehşet bir proje yapmışlar

  • ahmet turan
    10 Mart 2016 at 11:24

    merhaba bende bu konuyu bitirme projesi olarak aldım ve bizde MATLAB kullanmayı düşünüyoruz fakat hiçbir bilgimiz ve deneyimimiz yok. Projeyi yaparken hangi kaynakları ve algoritmaları kullandınız yardımcı olabilir misiniz?

  • Berkay Ali
    3 Haziran 2016 at 23:06

    Merhaba. Örnek projeyi paylaşma imkanınız var mı?

  • 6 Şubat 2017 at 19:53

    Merhaba, Bu projeyi Arduino MEGA üzerinde kullanmak istiyorum bunu nasıl yapabilirim? Eğer Arduino MEGA’da kullanabilirsem 4 kamerayla aynı anda kullanabilir miyim? yardımcı olabilir misiniz?

  • Mehmet Yücesoy
    1 Mart 2017 at 13:02

    Hocam tüm kodu ve projeyi paylaşabilir misiniz?

YORUM YAP