Haraket Algılama ve Nesne Takibi
Bugün gelen soruların biri bana eski bir çalışmamı hatırlattı. Daha önce yazdığım bir yazının kaybolduğunu farkettim. Blog sistemini sıkça değiştirdiğim için sanırım aralarda veri kaybı da oluyor. Neyse ki çalışmayı eski yedekler arasında buldum ve yeniden yayına koyuyorum...
Birçok resim işleme yönteminin ortak sorunu resimlerdeki kontrast ve parlaklık. Resimdeki her bir ayrıntı bilgisayar için çok önemli ve bu ayrıntılardaki ufak değişiklikler bilgisayar tarafından hemen algılanır. Yazacağımız nesne takip programı da bu sorunla karşı karşıya kalmaktan kurtulamayacak sanırım.
Haraket algılama ile başlayalım. Akan bir görüntü üzerinde bir cismin haraket ediyor olarak kabul edilebilmesi için görüntü üzerinde belli bir bölgede pixel değerlerinin sürekli değişiyor olması gerekir. Yukarıda bahsettiğim parlaklık sorunu da işte burada ortaya çıkıyor. Webcamler ile çalışacağımız için özellikle otomatik olarak ışık dengesi ayarlayan webcamler bize bu konuda sorun çıkaracaktır. Bu sorunu çözmek için pixellerde haraket belirtme ihtimali düşük olan değişiklikleri gözardı etmemiz gerekiyor...
Haraketli görüntüyü oluşturan resimleri ikişer ikişer inceliyoruz. 1. resmin pixel değerlerini 2. resimin pixel değerleri ile karşılaştırıp, aralarında belirlediğimiz eşik değerinin üstünde fark bulunan pixelleri görüntü üzerinde işaretliyoruz. İkişer ikişer tüm resimlere aynı işlemi uyguladığımızda aslında haraket eden pixelleri işaretlemiş oluyoruz. Bu sayede cismin hızını pixel/saniye cinsiden bulabilmemiz de mümkün oluyor.
Nesne takibi de yukardaki yönteme dayanıyor. Yukardaki işlemleri uyguladıktan sonra işaretlediğimiz en ust, en alt, en sağ ve en sol pixeli belirlememiz gerekiyor. Bunu yapmak kolay. Daha sonra belirlediğimiz 4 noktayı köşe kabul eden dikdörgen şeklindeki bölgeyi aynen başka bir resme kopyalıyoruz. Böylece yeni resmimizde sadece haraket halindeki nesneyi görmemiz mümkün oluyor. Tabi haraketli görüntü elde edebilmek için bu işlemleri arka arkaya yapmamız şart. Ancak bu yöntemin, 2.4 ghz işlemcili bilgisayar üzerinde saniyede 2-3 resimden fazlasını işleyemediğini söylemeliyim. Hızı arttırmak için tüm pixelleri taramak yerine, her pixelden sonra 4-5 pixel atlanarak işlem yapılabilir. VB6'daki pixel okuma yazma fonksiyonları yavaş olduğu için suçu VB6'ya atmanın bir sakıncası yok.
Konu nesne takibi iken başka bir yöntemden daha bahsedeyim. Bu yöntemle, haraket eden veya etmeyen herhangi bir cismi işaretleyip onu takip edebiliriz. Bunu ilk yöntem yapamaz, o yüzden nesne takibi konusunda bu daha başarılı olabilir.
Öncelikle takip edilecek cismin rengini seçiyoruz. Tüm resmi tarayıp, bu renge benzer renk içeren pixelleri işaretliyor ve işaretli pixellerde, yukardaki yöntemde olduğu gibi kenar pixelleri (üst,alt...) belirleyip yine bu pixelleri köşe kabul eden dikdörtgen bölgeyi başka bir resme kopyalıyoruz. Bu yöntem sayesinde resimleri ikişer ikişer işlememize de gerek kalmıyor. Her bir resim bittiğinde webcamden yeni bir resim isteyip onu işleyerek haraketli görüntü sağlamaya çalışıyoruz. Hız 1. yöntemdekinden pek farklı değil. Hız dışında sorunlarımız da var. Resim üzerinde cisme ait olmayan bir bölgede cismin rengi bulunmamalı. Bu yüzden fark eşiğini iyi seçilmesi lazım. Yine otomatik ışık denge ayarı yüzünden arasıra cisim rengini yeniden seçmemiz gerekebilir...
Yayınlanma Tarihi: 24 Ocak 2010 Pazar - 13:16
Anahtar Kelimeler: nesne, takip, haraket tespiti, motion detection, cisim, takibi, pixel, webcam, kamera, görüntü
Yorumlar ( 14 )
livetogogo#5
06/05/2010, 01:42
programı indirebileceğimiz bir yer varmı?
Hüseyin Atasoy#6
06/05/2010, 16:57
Programı yayına koymadım. Zaten örnek olsun diye yazdım...
Yalçın Erdemir#7
11/06/2010, 09:27
Hüseyin Bey Merhaba!
Ben Yalçın ERDEMİR. Bir kamu kuruluşunda çalışıyorum. Amatörce Visual Basic 6.0 ile programcılıkla uğraşıyorum.Bir süredir web camerasından plaka okuma üzerine çalışıyorum.picturebox içinde plaka yerinin tesbiti için çalışıyorum.Sizin bu yukarıdaki Hareket Algılama ve Nesne Takibi için verdğiniz resimdeki kodaları verebilirseniz çok işime yarayacak.Yok eğer bir ücreti var derseniz onu da bana bildiriniz.Teşekkür ederim.
Kolay Gelsin.
Hüseyin Atasoy#8
12/06/2010, 10:26
Yukarıdaki programın çalışma mantığı ile plaka yer tespiti yapmak imkansız. Şu dosyayı inceleyebilirsiniz:
http://www.ikss.org/ici-2004/ici-2004-pdf/EC08-08.pdf
liones#9
29/06/2010, 11:17
meraba bende visual basic 6.0 var
Kamera = capCreateCaptureWindow("KameraPenceresi", 1, 0, 0, 0, 0, 0, 0)
capCreateCaptureWindow kodda hata veriyor napabilirim acaba??
Hüseyin Atasoy#10
29/06/2010, 12:37
Verdiği hatayı da yazsaydım keşke. Böyle sadece atar tutarım; belki de bilgisayarında avicap32.dll dosyası bulunmuyordur...
liones#11
29/06/2010, 17:18
avicap32.dll yükleyince düzeldi saolun :D
hamdi#13
26/04/2011, 19:08
mrb
bu programla nesnedin uzaklıgını kordinatları belirleyip servo motor kontrolu yapa bilirmiyiz bu konuyla ilgili bir proje calışmam var kaynak bulamıyorum.
Hüseyin Atasoy#14
27/04/2011, 19:47
Yazıdaki metodun uzaklık ölçümü konusunda yardımcı olabileceğini sanmıyorum. Görüntü üzerinde bir cismin uzaklığının nasıl tespit edilebileceği konusunda hiçbir fikrim yok.
Yorum/Görüş Bildir