Kameralı Hız Belirleme

Kamera ile hız belirlemek (bir tür radar) konusunda öğrenciler ya da meraklılar için basit bir HALCON kodu ile yardımcı olmak istedim. Kameralı hız belirleme konusunda bir çok yaklaşım olabilir. En sık kullanılan yaklaşım, ardışıl olarak alınan 2 görüntü arasında, farklılıkları belirlemek, (bu farklılıklar genellikle yer değiştiren nesneler, yani araçlardır) ve bu farklılıktan kaynaklanan yer değiştirme mesafesini bulup, arada geçen zamana bölmek suretiyle hızın elde edilmesidir.

Örnek olması açısından, şirketimizin balkonundan cep telefonumla sokaktan geçen araçlarn resimlerini çektim. (Normalde, kullanılan endüstriye kameralar, resim ile birlikte resmin alındığı hassas zaman bilgisini de verirler. Konuyla ciddi ilgilenenler o tür kameralar bulmalıdır. örneğin iDS imaging ürünleri)  Ben cep telefonumla çektiğim için, ortalama 2 sn bekledim. (Yani, umarım) Tabii elim sabit olmadığı için kamera biraz titredi 🙂 Yine de tüm bunlar, yoldan geçen güzelim twingonun hızını iyi kötü belirlemem için engel teşkil etmedi.

İşte aldığım resimler ve işte bunları işleyen HALCON kodu.

Aslında buradan rar dosyasını da indirebilirsiniz.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Programın çalıştırılması ile oluşan ekran görüntüsü ise

 

 

 

 

 

 

 

 

Programın çalışma şekli.

Program aslında thresholding ile, lacivert renkli nesneleri arar. Görüntü renkli kamera ile alındığı için, önce RGB kanallarına ayırıyor resmi. Sonra HSV değerlerini buluyor. Threshold işlemlerini HSV kanallarında yapıyor.

Bir kere aracı bulduktan sonra, gerisi zaten 4 işlem. Anlatmaya gerek yok.

İdealde, bunun gibi sadece özel bir renge göre radar yapılmaz tabii 🙂

İdealde olması gereken, iki resmin karşılaştırılıp, aradaki farkı oluşturan noktalardan araçlar bulunup hız belirleme yapılmasıdır. check_difference isimli HALCON örneği incelemeye değer güzel bir çalışmadır mesela.

Konuyla ilgilenenlere kolay gelsin diyorum. İlgi alaka olursa, daha profesyonel olarak konuya yaklaşımları da irdeleyebiliriz.

Hareketli Bir Nesnenin Yerinin, Hızının ve Doğrultusunun Belirlenmesi

Hareketli bir nesnenin (insan, araba vb. olabilir) nereye, hangi hız ve açıda hareket ettiğinin belirlenmesi, görüntü işleme teknikleri hızlı ve tutarlı olarak yapılabilmektedir. Bu konuya örnek olabilmesi açısından, masamda bir oyuncak robotu hareket ettirerek, kamera ile üstten bakıp fotoğraflarını aldım. 5 farklı pozisyonda aldığım bu fotoğrafları işleyerek her bir pozisyon için, bir öncekine göre hız ve açı değişimini hesapladım. (Normalde, bu işlem kameradan alınan görüntülerle canlı olarak yapılmalıdır.  İşlem mantığı tamamen aynı olacağı için, off-line yani dosyadan yüklenen resimler ile çalışıldı. HALCON kullanan herhangi biri, kamerası olmasa bile örneği çalıştırabilsin diye)

Aldığım 5 adet fotoğrafın yanyana görüntüsü aşağıdaki gibi. Kullandığım fotoğrafları buraya tıklayıp bilgisayarınıza indirebilirsiniz.

 

Gerçek hayattaki olabilecek uygulamalara benzemesi açısından, takip edeceğimiz robotun yanına, benzer renklerde engeller koydum. (Program bu engelleri eleyebilmeli) engellerin yerlerini her bir resimde değiştirdim. (Değişen arka zemin, farklı nesnelerin de görüntüye girmesi vb. durumlarda program doğru nesneyi takip edebilmeli)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Hareketli oyuncak robot ve ona tepeden bakan kameranın yerleşim görüntüsü. Robotun çevresine aynı renkteparçalar koydum (sistemin kafasını karıştırabilmek için). Robot engellere takılmadan yürüyecek ve biz de kamera ile robotun hareketini izleyeceğiz.

Şimdi işin HALCON kodlamasına geçelim.

Sistemin temel mantığı ardışıl olarak alınan 2 resmi karşılaştırmak ve aradaki farkları bulmak üzerinedir. HALCON daki sub_image fonksiyonu, 2 görüntüyü birbirinden çıkarır ve fark görüntüsünü geri döndürür. Kullanılan dual_threshold fonksiyonu sayesinde, hem eski pozisyonu hem de yeni pozisyonu ayrı iki bölge olarak elde ederiz. Bundan sonrası, engellerin ve görüntüye giren beklenmeyen nesnelerin elenmesi (select_shape) ve son olarak ta bulunan sonuçların ekranda listelenmesidir. Her bir hareket için, robotun eski konumu, yeni konumu, gidilen mesafe, dönülen açı hesaplanacaktır.

Önce tam HALCON kodunu verelim.

dev_set_line_width(1)
set_display_font (3600, 12, 'mono', 'true', 'false')
gen_empty_obj(Robots)
for Index := 1 to 4 by 1
    read_image (Image1, 'C:/Users/Mustafa/Desktop/' + Index + '.bmp')
    S := Index + 1
    read_image (Image2, 'C:/Users/Mustafa/Desktop/' + S + '.bmp')
    convert_image_type (Image1, ImageConverted1, 'int2')
    convert_image_type (Image2, ImageConverted2, 'int2')

    sub_image (ImageConverted1, ImageConverted2, ImageSub, 1, 0)
    dual_threshold (ImageSub, RegionDiff, 500, 20, 10)

    closing_circle(RegionDiff, RegionClosing, 3.5)
    select_shape (RegionClosing, SelectedRegions, ['area','height'], 'and', [40000, 250], [80000, 450])
    count_obj(SelectedRegions, Number)
    if (Number = 2)
        select_obj(SelectedRegions, FirstObject, 1)
        select_obj(SelectedRegions, NextObject, 2)
        if (Index = 1)
            concat_obj(Robots, FirstObject, Robots)
        endif
        concat_obj(Robots, NextObject, Robots)
    endif
endfor
* Display islemleri
* Katedilen mesafe (pixel cinsinden) ve doğrultu (açı) yazalım
dev_display(Image2)
dev_display(Robots)
dev_set_color('yellow')
area_center(Robots, Area, Row, Column)
count_obj(Robots, Number)
for Index := 1 to Number - 1 by 1
    disp_arrow(3600, Row[Index - 1], Column[Index-1], Row[Index], Column[Index], 5)
    distance_pp(Row[Index - 1], Column[Index-1], Row[Index], Column[Index], Distance)
    angle_lx(Row[Index - 1], Column[Index-1], Row[Index], Column[Index], Angle)
    tuple_deg(Angle, Deg)
    disp_message (3600, Distance$'.3' + ' px.', 'image', Row[Index-1], Column[Index-1], 'white', 'false')
    disp_message (3600, Deg$'.2' + ' derece', 'image', Row[Index-1] + 40, Column[Index-1], 'white', 'false')
endfor

Bu kod çalıştırıldığında elde edilen ekran görüntüsü ise aşağıdaki gibi olacaktır. Robotun son 5 hareketinde, nereden nereye gittiğini ve kaç derece dönerek hareket ettiğini gözlemlemek mümkündür. Otoyollarda kullanılan Radar sistemi doppler frekansı mantığına göre çalışmakla birlikte, kamera ile yapılan hız kontrollerinde bu ve benzeri yöntemler kullanılmaktadır.