PTZ kamera ile hedef takibi
Transkript
PTZ kamera ile hedef takibi
PTZ KAMERA İLE HEDEF TAKİBİ SONY EVI - D70 PTZ KAMERA UTKU ESEN KOCAELİ ÜNİVERSİTESİ GİRİŞ Günümüzde kamera sistemleri ve teknolojileri oldukça gelişmiş durumdadır. Buna bağlı olarak da kameraları kullanarak yapabildiğimiz uygulamalar ve teknikler de zamanla artmıştır. Bu uygulamaların kullanım amaçları kişinin isteğine veya ihtiyacına bağlı olarak değişebilir. Bu projenin amacı, ptz kamera kullanarak hedefi tespit ve takip etmektir. Bu projede; * Kullanılabilecek hedef tespit yöntemleri, * PTZ kameranın özellikleri, * MATLAB ‘ da PTZ kamerayı GUI kullanarak kontrol etme, * PTZ kamera ile hedef takibi, konularına ulaşabilirsiniz. 1.BÖLÜM HEDEF TESBİT YÖNTEMLERİ GİRİŞ Hedefi tespit etmek amacıyla geliştirilen yöntemler uygulama alanına göre farklılık gösterebilir. Bu yüzden hedef tespit yöntemlerinin hepsine değinilmeyecek. Projeye yönelik kullanılabilecek olan yöntemler üzerinde durulacak. Bu yöntemler ; * Arka plan çıkarımı ve eşikleme, * Fark alma, olmak üzere ikiye ayrılıyor. Daha değişik yöntemlerde kullanılabilir. Projede bu yöntemler üzerinde duruldu. Bu yöntemlerin projeye yönelik eksikleri ve artıları tartışıldı ve sonuç olarak da bu yöntemlerden biri kullanılarak proje sonuçlandırıldı. ARKA PLAN ÇIKARIMI VE EŞİKLEME Bu yöntem basitçe ard arda yakalanan görüntülerden(frame) ortalama bir görüntü elde ederek arka plan çıkartma, arka plan çıkartıldıktan sonra ise yeni alınan görüntü ile arka planın farkından, nesneyi elde etme mantığına dayanıyor. Eşikleme kullanarak ise imgemizi lojik hale getiriyoruz ki üstünde işlem yapmamız daha kolay olsun. Ortalama almak için, alınan görüntülerin 3 renk kanalı (R, G, B) değerleri noktasal olarak tek boyutlu bir dizide toplanıyor. Daha sonra bu toplam, alınan görüntü sayısına noktasal bölünerek arka plan elde ediliyor. ARKA PLAN ÇIKARIMI VE EŞİKLEME Ard arda elde edilen framler Ortalama alınarak elde edilen arka plan • ARKA PLAN ÇIKARIMI VE EŞİKLEME MATLAB’ da iki resmin farkını alma ile ilgili örnek kod parçası aşağıda verilmiştir. fark = abs(imge – arka_plan); % abs komutu işlemin mutlak değerini alıyor. Arka plan çıkartıldıktan sonra alınan frame = Arka plan Fark resmi ARKA PLAN ÇIKARIMI VE EŞİKLEME • • Fark imgesini elde ettikten sonra, imge üzerinde yapacağımız işlemleri rahat yapabilmek için imgeyi lojik hale getirmemiz gerekiyor. Bu işlemi eşikleme kullanarak yapacağız. Eşiklemede ; - - Öncelikle yapacağımız uygulamaya yönelik eşik değeri belirlenir ve bir değişkene atanır. Değişkene atamamızın nedeni ileride yapıcağımız değişikliklerde, yazdığımız kodda teker teker eşik değerlerini değiştirmek yerine tek bir yerden değiştirebilme kolaylığı sağlamaktır. Daha sonra, elde ettiğimiz fark imgesinde 3 renk kanalı için piksel değerlerini eşik değer ile karşılaştırarak; büyük olan değerleri 1, küçük – eşit olan değerleri ise 0 yaparak lojik görüntümüzü elde edeceğiz. ARKA PLAN ÇIKARIMI VE EŞİKLEME EŞİKLEME Fark resmi Elde edilen lojik resim ARKA PLAN ÇIKARIMI VE EŞİKLEME • Aşağıda MATLAB da yazılmış, eşikleme ile ilgili örnek kod parçacığı verilmiştir. - esik_degeri = 25; - binary_data =(data(:,:,1) > esik_degeri) ) & (data(:,:,2) & esik_degeri) & (data(:,:,3) > esik_degeri) ; RED GREEN BLUE ARKA PLAN ÇIKARIMI VE Elde ettiğimiz lojik resim her zamanEŞİKLEME bu kadar temiz olmayabilir. Bu yüzden lojik resim üzerinde birkaç morfolojik işlem uygulamamız gerekiyor. Uygulayacağımız yöntemler “aşındırma” ve “yayma” yöntemleri olacak. Önce aşındırma kullanarak hedefin dışına oluşan parazit nesneleri yok edeceğiz. Sonradan uygulayacağımız yayma tekniğiyleyse nesnemizi gerçek boyutuna geri döndüreceğiz. Gürültülü imge Aşındırma uygulanmış hali Yayma uygulanmış hali ARKA PLAN ÇIKARIMI VE EŞİKLEME Aşağıda MATLAB da yazılmış, aşındırma ve yayma ile ilgili örnek kod parçacığı verilmiştir. - noised_data = binary_data ; - se = strel('disk',2); % disk şeklinde kernel oluşturuyoruz. noised_data = imerode(noised_data,se); % oluşturduğumuz kernel ile aşındırma uyguluyoruz clean_data = imdilate(noised_data,se); % aşındırma uygulanan imgeye yayma uyguluyoruz • • ARKA PLAN ÇIKARIMI VE Temizleme işlemi sonucunda imgede birden çok nesne de kalabilir. Bu nesneleri EŞİKLEME ayırt edebilmek için MATLAB ın bize sunmuş olduğu özel fonksiyon “ bwlabel ” fonksiyonudur. Bu fonksiyon sayesinde imgede oluşan nesnelere etiket verebiliriz. Nesneleri etiketledikten sonra bu nesnelerin bazı özelliklerini öğrenerek içinden istediğimiz nesneyi seçebiliriz ve bu nesneye işlemler uygulayabiliriz. MATLAB da bu işi yapmamızı sağlayan özel fonksiyon ise “ regionprops “ fonksiyonudur. Bu fonksiyon sayesinde nesnenin ağırlık merkezine, başlangıç ve bitiş koordinatlarına, alan büyüklüklerine v.b özelliklerine erişebiliriz. Aşağıda bwlabel fonksiyonu örneği verilmiştir. objects= İmage = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 objects = bwlabel(image, 4); 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 2 0 0 0 3 0 0 0 0 3 3 3 3 0 0 0 0 0 0 0 0 0 • ARKA PLAN ÇIKARIMI VE EŞİKLEME “regionprops” fonksiyonunu kullandığımızda ise MATLAB “workspace” imizde “struct” yapısında bir değişken oluşur. objects_properties = regionprops(objects, ‘basic’); % basic komutu nesnenin area, centroid, boundingbox özelliklerine ulaşmamızı sağlar. • • ARKA PLAN ÇIKARIMI VE EŞİKLEME “workspace” imizde oluşan bu değişkene çift tıkladığımızda nesnenin Area, Centroid ve BoundingBox özelliklerine ulaşabilirsiniz. Eğer birden fazla nesne bulunursa değişkenin boyutu (nesne_sayisi x 1) şekline dönüşür. ARKA PLAN ÇIKARIMI VE EŞİKLEME • • Nesne özelliklerini kullanarak nesne ayıklama işlemleri yapılabilir. Aşağıda MATLAB da hazırlanmış, nesne özellikleri kullanılarak hedefi işaretleme örneği gözükmektedir. Burada nesne özelliklerinden Area(alan büyüklüğü) ‘ yı kullanarak nesne seçilmiştir. BoundingBox(başlangıç noktaları ve nesnenin piksel büyüklüğünü veren özellik) özelliği sayesinde ise hedefin kenarlarını çizme işlemi yapılmıştır. • • • ARKA PLAN ÇIKARIMI VE EŞİKLEME YÖNTEMİNİN EKSİKLERİ Eğer fark alırken farkın mutlağını almazsak arka planda beyaz(255,255,255), kırmızı(255,0,0), yeşil(0,255,0) veya mavi(0,0,255) olan bir yerin üzerine gelen nesne yada nesnenin bir kısmı bu yöntemle algılanamayabilir. oluşturduğumuz eşik değeri bu örnek için geçerli olabilir fakat başka bir frame grubunda çalışmayabilir. Örneklerde de görüldüğü üzere bu sistemin hareket etmeyen, sabit kameralarda kullanılması daha sağlıklıdır. Çünkü hareket eden kameralarda arka plan sürekli değişecektir. Bu yüzden bu tekniği projemizde kullanamayacağız. FARK ALMA YÖNTEMİ • • Fark alma yönteminin büyük bir kısmını aslında bir önceki yöntemde uygulamıştık. Bu yöntemin arka plan çıkartmadan farkı; fark alma işleminde arka plan ile son frame yerine, ard arda alınan framlerin kullanılmasıdır. Bu yöntem sayesinde görüntüdeki hareketleri algılayabiliriz. Bu yöntem için ard arda framler almamız gerekiyor aşağıda bu işlemin MATLAB da bir örneği verilmiştir. Video = videoinput(‘winvideo’); % kamera kullanıcağımızı belirtiyoruz. triggerconfig(video, 'manual'); % trigger işlemini manual yaparak frame alma hızımızı arttırıyoruz. start(video) ; % videoyu almaya başlıyoruz ama henüz ekranda göremeyiz. preview(video); % videoyu ekrana bastırıyoruz. First_frame = getsnapshot(video); % ilk framimizi aldık. Second_frame = getsnapshot(video); % ikinci framimizi de aldık. Fakat ikisi birbirine eşit değil. % çünkü frame i alırken yapılan işlemler bilgisayarımıza zaman kaybettiriyor. FARK ALMA YÖNTEMİ • • • Ard arda frameleri aldıktan sonra sıra bu framelerin farkını almaya geliyor. Bundan sonra yapacağımız işlemler arka plan çıkartımına benziyor. Ondan farklı olarak burada frameleri bölütlememiz gerekiyor. Çünkü burda nesneyi değil, hareketi algılayabiliyoruz. Frame’ i bölütleyerek hangi bölümde ki nesnede hareket var onu algılayabiliriz. Kameramızın aldığı görüntünün çözünürlüğü DVD (576 x 720) formatındadır. 576 ve 720 sayıları 24 e tam bölünebildiği için frameleri 24 x 24 lük parçalara bölüyoruz. Bölünen parçaların piksel değerlerinin toplamını, (24 * 24 * eşik değer) sayısıyla karşılaştırıyoruz. Eğer toplam bu sayıdan büyükse o bölgede hareket vardır, eğer küçükse yoktur diyoruz. Bu sayede hareketli olan nesneyi hedef olarak seçebiliyoruz. FARK ALMA YÖNTEMİNİN EKSİKLERİ • Bu yöntem de kamera hareketinden kötü anlamda etkilenebilir. Fakat arka plan çıkartma yöntemine göre kullanımı daha kolaydır. Biz projemizde kamera dönerken oluşan nesneleri hesaba katmayacağız. Sadece kamera durduğun da farklılıklara bakacağız. Ama bu işlemi hızlı yaptığımız için sorun olmayacak. Eğer arka plan çıkartma yöntemini kullansaydık ard arda en az 3 veya 4 tane görüntü almamız ve bunların ortalamasını almamız gerekecekti ki buda bize çok zaman kaybettirecektir. 2. BÖLÜM SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ • Ø Ø Ø • • PTZ’ nin açılımı; Pan = Sağa ve sola dönme özelliği; Title = Başlık anlamına geliyor. Yukarı ve aşağı hareketi temsil ediyor; Zoom = Kameranın görüntüyü yakınlaştırıp uzaklaştırma özelliği. PTZ nin açılımından da anlayabileceğimiz gibi kamera sağa – sola ve yukarıya – aşağıya hareket edebilme özelliğine sahip. Bunun yanında kameranın ayarlanabilen lensi sayesinde zoom özelliği de mevcut. Fakat biz bu özelliğini bu projede kullanmayacağız. Sony Evi – D70 hareket kontrolünü VISCA - RS232 / RS422 protokolleri ile gerçekleştirebilmektedir. Biz bu projede RS232 protokolü ile kameranın hareketini kontrol edeceğiz. SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ • • • Sağa ve sola 170 derece dönme kabiliyetine sahip. Yukarı 90 derece, aşağı ise 30 derece dönme kabiliyetine sahip. Kameranın zoomsuz görüş açısı 48 derecedir. SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ • Bu türden kameralar genelde tavana asıldığı için altında kameranın görüntüsünü ters çevirmeye yarayan switch bulunmakta. Aynı zamanda haberleşme protokolünü seçtiğimiz switch, baud rate switchi,kamerayı D30 moduna almaya yarayan switchde kameranın altındaki BOTTOM switch de yer almaktadır. BOTTOM switch SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ • Kameranın üzerindeki giriş ve çıkışların şeması aşağıda gösterilmiştir. • SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ Elimizde RS232 bağlantı kablosu olmadığı için kabloyu kendimiz yapmamız gerekti. Bu işlem için USB to SERİAL dönüştürücü ve SERİ PORT un dişisinden gerekmektedir. Aşağıda kablonun yapımı için gereken bilgiler verilmiştir. Pin kablo renklerini bulmak için AVOMETRE’nin kısadevre özelliğinden yararlanabilirsiniz. Ayrıca SERİ PORT un dişisinde pinleri ararken ortaya göre simetriğini almayı unutmayın. SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ • Kamerayı kontrol etmek için yollamamız gereken kodlar aşağıda gösterilmiştir. Kodların başında yer alan 8x ifadesi, 8 kameranın kontrol edilebileceğini ve bu kameralardan istediğimizi seçebileceğimizi ifade ediyor. Bu ifade hexadecimal bir ifade olup 1. kamerayı seçmek istiyorsak (81)16 = (129)10 , 2. kamerayı seçmek istiyorsak (82)16 = (130)10 yazmamız gerekmektedir. SONY EVI - D70 PTZ KAMERANIN ÖZELLİKLERİ • Aşağıda pan ve title ın derece / saniye cinsinden hızları verilmiştir. 3. BÖLÜM MATLAB’ DA PTZ KAMERAYI GUI KULLANARAK KONTROL ETME MATLAB’ DA PTZ KAMERAYI GUI KULLANARAK KONTROL ETME • MATLAB’ ın kullanıcılarına tanıdığı güzel bir özelliği olan GUI, arayüz oluşturmak amaçlı kullanılmaktadır. Bu sayede butonlara basarak kameramızı kontrol edebilmekteyiz. GUI oluşturmadan önce boş bir sayfada oluşturmak istediğimiz GUI’ nin taslağını çizmek bize zamansal olarak kazanç sağlayabilir. Aşağıda bizim projemiz için oluşturacağımız GUI nin taslağı gösterilmiştir. UP LEFT UP UP RIGHT INIT LEFT STOP RIGHT HOME LEFT DOWN DOWN RIGHT DOWN EXIT AUTO TRACKKİNG MATLAB’ DA PTZ KAMERAYI GUI KULLANARAK KONTROL ETME • Oluşturduğumuz taslağı gerçekleştirmek için önce MATLAB’ da yeni bir GUI yaratıyoruz. Daha sonra açılan pencerede, araç kutusundan sürükleyerek veya çizerek butonları oluşturuyoruz. Dosyamızı kaydettikten sonra karşımıza MATLAB otomatik olarak .m uzantılı Mfile oluşturuyor. Daha sonra Butonlara basılacağı zaman yapılması gerekenleri butonların Callback fonksiyonlarının altına yazıyoruz. Eğer program açılmadan önce yapmamız gerekenler varsa “OpeningFcn” fonksiyonunun altına yazıyoruz. Fonksiyonlar da kullanacağımız değişkenler eğer ortak ise değişkeni “global” tanımlamamız gerekiyor. Bunun için yazılmış örnek kod aşağıda gösterilmiştir. function gui_cam_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); global data; data = 1;; function home_button_Callback(hObject, eventdata, handles) global data; data = data + 1; MATLAB’ DA PTZ KAMERAYI GUI KULLANARAK KONTROL ETME • Oluşturduğumuz GUI aşağıda gösterilmiştir. 4.BÖLÜM PTZ KAMERA İLE HEDEF TAKİBİ Önceki bölümlerde anlatılanları bir araya getirdiğimizde istediğimiz sonucu elde edebiliriz. Öncelikle nesneyi bulurken fark alma yöntemi kullanacağımızı biliyoruz. Nesneyi bulduktan sonra kameranın merkezine getirmemiz gerekicek. Bunun içinde kameranın hız özelliklerini ve GUI kullanımını iyi bilmemiz gerekiyor. • • Kameranın zoomsuz görüş açısının 48 derece olduğunu biliyoruz. Yani, eğer bir cisim kameranın görüş açısının en uç noktasındaysa kamerayı 48 derece döndürmemiz gerekecektir. Ayrıca bu işlemleri hızlı yapmamız açısından kameranın hızlı tepki vermesi gerekiyor. Bu yüzden kameranın hızını da olabildiğince yüksek tutmamız gerekiyor. Kameranın hız özelliklerine baktığımızda sağ –sol dönme hızı maksimum 100 derece/saniye. Eğer kamerayı maksimum hızda 0.5 sn ye döndürürsek istediğimiz sonuca ulaşabiliriz. Aynı şey başlık içinde geçerli onu da maksimum hızda ve 0.5 sn sürece çalıştırırsak uç noktaları odaklayabiliriz. PTZ KAMERA İLE HEDEF TAKİBİ • Fakat eğer cisim nesnenin daha orta bölgelerinde ise bu sefer odaklamak için kameranın dönme hızının daha düşük olması gerekir. Aşağıda kameranın odaklaması gereken yere göre hız denklemi verilmiştir. Burada hızın maksimum değerinin yarısı kadar verilmesinin nedeni motor sürme süresinin 1 sn yerine 0.5 sn olarak belirlememizdir. kamera_hizi_x = 11; kamera_hizi_y = 12; donulecek_yol_x = odak_nok_x - odaklanicak_nokta_x; donulecek_yol_y = odak_nok_y - odaklanicak_nokta_y; donulecek_yol_x_buyukluk = abs(donulecek_yol_x); donulecek_yol_y_buyukluk = abs(donulecek_yol_y); hiz_y = floor(donulecek_yol_y_buyukluk / kamera_hizi_y); % floor fonksiyonuyla virgüllü değeri aşağıya yuvarlıyoruz. hiz_x = floor(donulecek_yol_x_buyukluk / kamera_hizi_x); PTZ KAMERA İLE HEDEF TAKİBİ • • Odaklanılacak noktayı yani hedefi bulurken,;hareket olan yerlerin ağırlık noktalarının x ve y değerleri toplanıp, hareketli yer sayısına bölünerek ortalama ağırlık noktasını bulma mantığı kullanılmıştır. Bunun yerine hareketin en çok olduğu yerde hedef olarak seçilebilirdi veya odağa en uzak olan hareketli yerde seçilebilirdi. Bu tamamen kameranın kullanım amacına bağlıdır. Biz projemizde ortalama ağırlık merkezini hedef olarak seçiyoruz. Aşağıda ortalama ağırlık merkezini seçmeye yarayan MATLAB kodu bulunmakta. for i = 1 : nesne_sayisi center_total_x = center_total_x + nesne_ozellikleri(i,1).Centroid(1,1); center_total_y = center_total_y + nesne_ozellikleri(i,1).Centroid(1,2); end center_x = center_total_x / nesne_sayisi * bolutleme_orani; center_y = center_total_y / nesne_sayisi * bolutleme_orani; • Bölütleme oranıyla çarpmamızın sebebi; ortalama bulma işlemlerini, frami ayırdığımız bölmelerin üzerinde yapmamızdan kaynaklanıyor. PTZ KAMERA İLE HEDEF TAKİBİ • • • Hedefi bulduktan ve odaklanılacak noktayı tesbit ettikten sonra geriye kamerayı o yöne odaklamak kalıyor. Bunun için kameraya RS232 protokolü ile komutlar göndermemiz gerekiyor. Normalde kameramızın odak noktasına göre dönmesi gereken koordinatları verdiğimizde kendisi otomatik olarak o noktayı odaklıyor. Fakat biz bu işlemi kendimiz yapmak istiyoruz bu yüzden kameraya DÖN – DÖNMEYE DEVAM ET – DUR komutlarını söylememiz gerekiyor. Bunun yanında kameranın odağından çok az uzaklıktaki noktalarda hareket olduğu belirlenirse ve biz her seferinde bu noktaları odaklamak istersek hem kameranın harcadığı enerji hemde işlem yükü artar. Bunu engellemek için kameraya odaklama sınırı koymamız gerekiyor. Eğer odaklanılacak noktanın uzaklığı odak noktasından yeteri kadar uzakt değilse kamera odaklama işlemini yapmıcaktır. Bir sonraki sunuda bu işlemleri gerçekleştiridiğimiz MATLAB kodları yer almaktadır. PTZ KAMERA İLE HEDEF TAKİBİ if donulecek_yol_x_buyukluk > odaklama_siniri_x || donulecek_yol_y_buyukluk > odaklama_siniri_y hiz_y = floor(donulecek_yol_y_buyukluk / kamera_hizi_y); hiz_x = floor(donulecek_yol_x_buyukluk / kamera_hizi_x); w = hiz_x; v = hiz_y; if (donulecek_yol_x < 0) && (donulecek_yol_y < 0) %right - down fwrite(communication,[129 1 6 1 v w 2 2 255]); end if (donulecek_yol_x > 0) && (donulecek_yol_y < 0) fwrite(communication,[129 1 6 1 v w 2 1 255]); %right - up end if (donulecek_yol_x < 0) && (donulecek_yol_y > 0) fwrite(communication,[129 1 6 1 v w 1 2 255]); %left - down end if (donulecek_yol_x > 0) && (donulecek_yol_y > 0) fwrite(communication,[129 1 6 1 v w 1 1 255]) %left - up end pause(0.35); fwrite(communication,[129 1 6 1 v w 3 3 255]); % stop end PTZ KAMERA İLE HEDEF TAKİBİ • RS232 protokolünün MATLAB da kullanımı ile ilgili örnek kod aşağıda verilmiştir. communication = serial('com4'); % seri port seçiliyor. fopen(communication); % seri port haberleşmek için açılıyor. fwrite(communication,[129 1 6 1 v w 3 3 255]); % dur komutu gönderiliyor. fclose(communication); % seri port kapatılıyor. • MATLAB da video alma ve ekrana basma ile ilgili örnek kod aşağıda verilmiştir. vidobj = videoinput('winvideo'); % kamerayı seçtiğimiz kod. triggerconfig(vidobj, 'manual'); % frame alma hızımı arttıran kod. start(vidobj); % videoyu başlatan kod. preview(vidobj); % videoyu ekrana bastıran kod. data = getsnapshot(vidobj);% videodan frame almamızı sağlayan kod. closepreview; % ekranda gösterilen video yu kapatmaya yarayan kod. clear(vidobj); % videoyu workspaceden siliyoruz. PROJE SORUMLUSU UTKU ESEN KOCAELİ ÜNİVERSİTESİ ELEKTRONİK VE HABERLEŞME MÜHENDİSLİĞİ 3. SINIF ÖĞRENCİSİ PROJE DANIŞMANI ORHAN AKBULUT KOCAELİ ÜNİVERSİTESİ İŞARET VE GÖRÜNTÜ İŞLEME LABORATUVARI(KULİS)