MATLAB ile Nesne Takibi (Object Tracking)

Matlab görüntü işleme konusunda da diğer birçok konuda olduğu gibi oldukça gelişmiş araçlara sahip bir programdır. Bu yazıda matlab içinde bulunan bu fonksiyonları kullanarak kameradan gerçek zamanlı nesne takibi yapan bir proje geliştireceğiz. Projenin özellikleri ise şu şekilde olacak.
  • Gerçek zamanlı takip
  • Birden fazla objenin ayırt edilebilmesi
  • Görüntüde tek bir obje varsa hareketinin (engel arkasında görünmeme durumunda) tahmini
  • Bulunan objelerin gösterilmesi

Bir nesneyi takip etmek için çeşitli görüntü işleme teknikleri birbiri ardına kullanılarak, görüntüler daha işlenebilir ve anlaşılabilir hale getirilmektedir. Bu kapsamda sırasıyla hangi işlemler yapacağımıza bakalım. Öncelikle kameradan aşağıdaki gibi bir görüntü elde ettiğimizi varsayalım ve buradan mavi renkli objeleri takip etmek istediğimizi düşünelim.


Kameradan bu görüntüyü alabilmek için yazmamız gereken kod şu şekildedir.
hardwareInfo=imaqhwinfo;
% Kamera donanımı hakkında gerekli bilgilerin alınması
[camera_name, camera_id, format]=cameraInfo(hardwareInfo);

% Donanım bilgilerinden kameranın özelliklerinin ayıklanması
memoryInfo=imaqmem;

% Bilgisayarın bellek bilgisinin alınması
imaqmem(memoryInfo.AvailPhys);

% Kullanıma müsait bütün belleğin görüntü işleme işlemleri için kullanılabilir hale getirilmesi
video = videoinput(camera_name, camera_id, format);

% Kamera özelliklerine göre video objesinin oluşturulması
set(video, 'FramesPerTrigger', Inf);

% Videonun sürekli frame alması için gerekli düzeltme
set(video, 'ReturnedColorspace', 'rgb');

% Videonun rgb uzayda dönmesi için gerekli ayarlama
video.FrameGrabInterval = 1;

% Videodan ne kadar sıklıkla frame çekileceği.
start(video);

% Videonun başlatılması
data = getsnapshot(video);
Buradan mavi renkleri ayıklamak için birkaç adım gereklidir. Öncelikle 3 renk katmanından (RGB) oluşan bu resmin mavi katmanını ayıklamak ve gri katmana göre farkına bakmak bize oldukça iyi bir tahmin verecektir. Resmin mavi katmanı aşağıdaki gibidir. Bu katman data değişkeninin 3. boyutunda tutulmaktadır ve erişmek için data(:,:,3) yazılması yeterlidir. Resmin gri renkli hali için ise Matlab içinde bulunan rgb2gray() fonksiyonu kullanılabilir.


Daha sonra bulunan mavi ve gri katmanlar birbirinden imsubtract() fonksiyonu ile çıkartılıp, aşağıdaki fark elde edilir.


Bu resme “Median Filtresi” uygulanarak tuz-biber gürültüsü adı verilen karıncalanmaların giderilmesi sağlanabilir. Bu işlem 2 boyutlu median filtresi fonksiyonu olan medfilt2() fonksiyonu ile yapılabilir.

Daha sonra eşik değerine göre resim içindeki renkler ayırt edilip, resim daha kolay çalışılabilir hale getirilmiştir. Bu işlemler şöyle yapılmaktadır.
img(img<threshold) = 0;
img(img>=threshold) = 255;


Dikkat edilirse burada sol alt köşeye doğru küçük bir obje vardır. Bu objenin görüntüde takip edilmesi istenmemektedir. Bu yüzden resim içindeki bağlı bileşenler bulunarak, alanı belli bir değerin altındaki objeler ayıklanabilir. Bu işlem Matlab içerisindeki bwareaopen() fonksiyonu ile kolaylıkla yapılabilir.

Şimdiye kadar yapılan işlemlerin resim üzerine eklenmesi ile elde edilen sonuç şu haldedir.

Bu işlemlere ek olarak bulunan nesnelerin kenarlarının bulunması için Canny kenar bulma yöntemi ve biraz da makyaj yapmak için bulunan sonuca dilation işlemi uygulanabilir. Bu işlemlerin sonucu ise şöyle olmaktadır.

Ancak bu işlemlerin yapılması bilgisayarın performansına bağlı olarak gerçek zamanlı takibi olumsuz kılabilmektedir. Bu yüzden bu kısımlar projede bulunmamaktadır. Bu işlemlerden sonra bulunan objelerin işaretlenmesi, konumlarının ve hızlarının bulunması işlemi gelmektedir. Bu işlem şu şekilde yapılabilir.

stats = regionprops(logical(Label),'BoundingBox','Centroid','FilledImage','Area');

% Bağlı bileşenlerin özelliklerinin çıkarılması
if(exist('stats','var'))

% Herhangi bir obje bulunması durumunda
for object = 1:length(stats)

% Bulunan her obje için
if(object < 16 && object > 0)

% Obje sayısı sınırlaması
boundingBox{object} = stats(object).BoundingBox;

% Objeyi çevreleyen dikdörtgenin koordinatları
centroid{object} = stats(object).Centroid;

% Objenin merkez noktası koordinatları
area(object,2) = stats(object).Area;

% Objenin alanı
if(area(object,2) >= 0)

% Objenin alanının kontrolüne göre önceki alan bilgisinin güncellenmesi
area(object,1) = area(object,2);
end

% Objenin bir önceki konumundan ne kadar uzaklaştığının hesaplanması
dx=round(objPosition(2,1,object)-objPosition(1,1,object));
dy=round(objPosition(2,2,object)-objPosition(1,2,object));
filledImage{object} = stats(object).FilledImage;

% Objenin küçük resminin alınması
rectangle('Position',boundingBox{object},'EdgeColor','r','LineWidth',2,'Parent',hmain)

% Objenin etrafına dikdörtgen çizilmesi
plot(hmain,centroid{object}(1),centroid{object}(2), ' ys','MarkerSize',6,'MarkerFaceColor','y')

% Merkez noktasına sarı işaretçi konulması
imshow(filledImage{object},'Parent',hsub(object))

% Bulunan küçük resimlerin ikinci grafiğe çizilmesi
title(hsub(object),[num2str(object) '. Obje']);

% Objelerin başlıklarının atanması
objPosition(1,:,object) = objPosition(2,:,object);

% Objenin eski konumunun güncellenmesi
objPosition(2,:,object) = [centroid{object}(1),centroid{object}(2),area(object,2)/imgSize];

% Objenin yeni konumunun bulunması
if(length(stats) == 1)

% Tek obje bulunması durumunda Objenin konumlarının bulunması
x = boundingBox{object}(1);
y = boundingBox{object}(2);

% Gürültüden veya objenin engel arkasına gitmesinden dolayı alandaki değişikliklerin ekarte edilmesi
if(area(object,2)/area(object,1) >= 0.9 && area(object,2)/area(object,1) <= 1.1)
theImage = stats(object).FilledImage;
end
else

% Birden fazla obje olması durumunda Hız, Konum, Alan bilgilerinin kullanıcıya gösterilmesi
txtInfo = text(centroid{object}(1)+15,centroid{object}(2), [num2str(object)...
'. X: ' num2str(round(centroid{object}(1))) ' Y: ' num2str(round(centroid{object}(2)))],'Parent',hmain);
txtSpeed = text(centroid{object}(1),centroid{object}(2)+15, [' dx: ' num2str(dx)...
' dy: ' num2str(dy) ' area: ' num2str(round(area(object,2)/100)*100)],'Parent',hmain);
set(txtInfo, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
set(txtSpeed, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'yellow');
end
end
end
end
Burada yapılan işlemleri kısaca özeltemek gerekirse, öncelikle regionprops() fonksiyonu ile bağlı bileşenlerin ve bu bileşenlerin istenen özelliklerinin elde edilmesi sağlanmaktadır. Daha sonra bulunan bu özelliklere göre her bir objenin alanını çevreleyen bir sınır çizilip, merkez noktası belirlenerek bu noktanın yanında cisimle ilgili bilgiler gösterilmektedir. Bu işlemlerin sonucu aşağıdaki gibidir.



Sahnede tek bir obje olması durumunda eğer obje bir engelin arkasına giriyorsa çalışan kod şu şekildedir.
% Objenin bilgileri varsa fakat ekranda hiç obje yoksa cismin

% hareketinin tahmini
if(exist('object','var') && exist('x','var') && exist('y','var') && length(stats) <= 1)

% Cismin sabit hızla aynı yönde gittiği tahmin edilerek bir sonraki konumunun hesaplanması
x=x+dx;
y=y+dy;

% Bulunan konuma küçük resmin çizilmesi
image(x,y,theImage*255,'Parent',hmain);
end
Böylece cismin konumu ve hızı tahmin edilmekte, bulunan değerlere göre tahmini rotası çizilmektedir.

Bulunan bütün objeler ise ek bir pencerede gösterilmektedir.



Son olarak ise performans sağlamak için alınan verilerin bellekten silinmesi işlemi vardır.
if mod(video.FramesAcquired,100)==0
flushdata(video);
end
Döngü bittikten sonra verilerin tamamen silinmesi ise şu kodlar ile sağlanmaktadır.
stop(video);
flushdata(video);
Projenin bütün kodlarına ulaşmak için aşağıdaki bağlantıyı kullanabilirsiniz.
Ad

Arduino Autocad Bilim-Teknoloji Biyomedikal Sistemler C-Programlama C# C# Programlama Diferansiyel Denklemler Dijital Kontrol Sistemleri Elektrik Devreleri 1 Elektrik Devreleri 2 Elektrik Makineleri 1 Elektrik Makineleri 2 Elektrik Tesislerinde Koruma Elektromantetik Alan Teorisi Elektromantetik Dalga Teorisi Elektronik 1 Elektronik 2 Elektronik-Devreler EmguCV Genel Fizik Genel Kimya Genel Matematik Gömülü Linux Güç Elektroniği Haberleşme Sistemleri İşaret ve Sistemler Lineer-Cebir Lojik Devreler Malzeme Bilimi MATLAB Mikroişlemciler Olasılık ve İstatistik Otomatik Kontrol Sistemleri PLC-Otomasyon Proje Yönetimi ve Girişimcilik Raspberry Pi Sayısal Analiz Sayısal İşaret İşleme Teknik-Kutuphane Termodinamik Yüksek Gerilim Tekniği
false
ltr
item
Çağlar GÜL: MATLAB ile Nesne Takibi (Object Tracking)
MATLAB ile Nesne Takibi (Object Tracking)
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ixSSFZoMqmwOfFS5a_qGjBHVIJD777vUUpwmAI9NfTDVx77MVfRdHRupjabyOqhWkpRkQ_9f7GJs8g0UhcOuUwjZOl3O3UHnZ4OkMtg0VAairGR3wdTMRk185cwtKbsJxibAOMd1Pv0/s1600/1.jpg
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4ixSSFZoMqmwOfFS5a_qGjBHVIJD777vUUpwmAI9NfTDVx77MVfRdHRupjabyOqhWkpRkQ_9f7GJs8g0UhcOuUwjZOl3O3UHnZ4OkMtg0VAairGR3wdTMRk185cwtKbsJxibAOMd1Pv0/s72-c/1.jpg
Çağlar GÜL
https://elektronikafa.blogspot.com/2015/09/matlab-ile-nesne-takibi-object-tracking.html
https://elektronikafa.blogspot.com/
http://elektronikafa.blogspot.com/
http://elektronikafa.blogspot.com/2015/09/matlab-ile-nesne-takibi-object-tracking.html
true
871250089272898028
UTF-8
Not found any posts Not found any related posts VIEW ALL Readmore Reply Cancel reply Delete By Home PAGES POSTS View All RECOMMENDED FOR YOU Tag ARCHIVE SEARCH ALL POSTS Not found any post match with your request Back Home Contents See also related Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sun Mon Tue Wed Thu Fri Sat January February March April May June July August September October November December Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec just now 1 minute ago $$1$$ minutes ago 1 hour ago $$1$$ hours ago Yesterday $$1$$ days ago $$1$$ weeks ago more than 5 weeks ago Followers Follow THIS CONTENT IS PREMIUM Please share to unlock Copy All Code Select All Code All codes were copied to your clipboard Can not copy the codes / texts, please press [CTRL]+[C] (or CMD+C with Mac) to copy