Image Processing ile Şerit Takibi (TR)

Berk Karabillioglu
6 min readJul 22, 2021

Daha önceki yazımda da bahsettiğim üzere sadece şerit üzerindeki yol takibini sadece yapay sinir ağları ile değil kasik OpenCV metodlarıyla da yapılabilmektedir. Bu yazımda bu projeden ve çıktılarından bahsedeceğim

Yapılacak olan bu model yapay sinir ağı ile değil görüntü işleme metodlarıyla çalışacaktır kod dizisi tamamen farklıdır.

1. Yol Bulma İşlemi:

İlk önce bir getLaneCurve işlevi oluşturacağız ve ardından resmimize bazı eşikler uygulayacağız.

Adım 1:

Şimdi buradaki fikir, yolu Renk veya Kenar Algılama kullanarak elde etmektir. Bizim durumumuzda, yol olarak normal A4 Beyaz kağıt kullanıyoruz, bu nedenle yolu bulmak için renk algılamayı kullanabiliriz. Eşikleme işlevini Utilities dosyasına yazacağız.

Thresholding fonksiyonu

Burada resmimizi HSV renk uzayına dönüştürüyoruz ve ardından bulmak için bir dizi renk uyguluyoruz.Bu renk, aşağıdaki renk seçici komut dosyası kullanılarak bulunabilir.Burdaki temel amaç renk uzayı scriptinden tam anlamıyla yolumuzun etraftan ayrı olarak beyaz geriye kalan bütün alanların siyah olarak çıktısını almaya çalışmaktır.

Renk Uzayı
Renk Uzayı ile Şeritlerin tanımlanması

Yazılan renk uzayı scripti sayesinde bu şekilde şeridimizi kendi elimizle HUE-HUE Maax- Sat Min- Sat Max- Value Min- Value Max değerleriyle en optime şekilde diğer bölgelerden ayırıyoruz.

2. Kırpma İşlemi

Kırpma işlemi

Görüntünün tamamını işlemek istemiyoruz çünkü sadece şu anda yoldaki eğriyi bilmek istiyoruz ve birkaç saniye ileride değil. Böylece resmimizi basitçe kırpabiliriz, ancak bu yeterli değil çünkü yola tepeden izliyormuşuz gibi bakmak istiyoruz. Bu, kuş bakışı olarak bilinir ve eğriyi kolayca bulmamızı sağlayacağı için önemlidir. Görüntüyü çarpıtmak için başlangıç noktalarını tanımlamamız gerekir. Bu noktaları manuel olarak belirleyebiliriz. Bu işlemi kolaylaştırmak için, farklı değerleri denemek için izleme çubuklarını kullanabiliriz. Fikir, yol düz olduğunda dikdörtgen bir şekil elde etmektir. Sonrasında ise orta noktamızı belirleyerek bu orta noktaya bir circle(daire)atanıp şeridin orta noktası bulunur.

İlk Çıktı

3. Dönüşleri Bulma İşlemi

Şimdi en önemli kısım geliyor, yolumuzdaki eğriyi bulmak. Bunu yapmak için piksellerin toplamını kullanacağız. Nasıl Yapılır? Kesilmiş görüntümüzün artık ikili olduğu, yani siyah veya beyaz pikselleri olduğu göz önüne alındığında, piksel değerlerini y yönünde toplayabiliriz. Buna daha detaylı bakalım. Yukarıdaki resim 255 değerli tüm beyaz pikselleri ve 0 olan tüm siyah pikselleri göstermektedir. Şimdi ilk sütundaki pikselleri toplarsak 255 + 255 + 255 + 255 + 255 = 1275 elde ederiz. Bu yöntemi sütunların her birine uygularız.

Orijinal Resmimizde genişlikte 480 pikselimiz var. Bu nedenle 480 değerimiz olacak. Topladıktan sonra, belirli bir eşiğin üzerinde kaç değerin tutulduğuna bakabiliriz, diyelim ki merkez kırmızı çizginin her iki tarafında 1000 diyelim. Yukarıdaki örnekte solda 8 sütun ve sağda 3 sütun var. Bu bize eğrinin sola doğru olduğunu söylüyor. Bu temel kavramdır, ancak bunu iyileştirmek ve tutarlı sonuçlar elde etmek için birkaç şey daha ekleyeceğiz. Ancak buna daha derin bakarsak bir sorunla karşı karşıya kalacağız. Bir bakalım.

Yukarıdaki resimler, bu yöntemlerin işe yarayacağı 3 durumu göstermektedir. Eğri doğru olduğunda, sağ taraftaki piksel sayısının soldan daha fazla olduğunu ve bunun tersini açıkça görebiliriz. Ve düz olduğunda, piksel sayısı her iki tarafta yaklaşık olarak aynıdır. Bunların hepsi iyidir, ancak bu yöntemin başarısız olacağı durumlar vardır. Aşağıda bir örnek gösterilmiştir.

Burada herhangi bir eğri olmamasına rağmen, bir tarafta daha fazla piksel bulunduğundan, algoritma ya sol ya da sağ eğri çıkaracaktır. Peki bu sorunu nasıl çözebiliriz? Cevap basit, orta çizgiyi ayarlıyoruz.

Öyleyse şimdi bize merkez çizgisini verecek olan tabanın merkezini bulmalı ve sonra her iki taraftaki pikselleri karşılaştırmalıyız.Her iki süreç de aynı fonksiyonla hesaplanabilir. Bu piksellerin toplamıyla temelde histogramı buluyoruz. Bu nedenle bu işlevi “getHistogram” olarak adlandıracağız. Tüm pikselleri toplamamız gereken ikinci adımı yaptığımızı varsayalım ve daha sonra tabanın merkezini bulmak için birinci adıma geri döneceğiz. İlk önce görüntüyü girdi argümanı olarak alacak fonksiyonumuzu açıklayacağız. Y yönündeki tüm pikselleri basitçe toplayacağız.

getHistogram Fonksiyonu
  • Burada histValues, her bir sütunun toplamını içeren 480 değeridir. Şimdi resmimizdeki bazı pikseller sadece gürültü olabilir. Dolayısıyla, hesaplamamızda onları kullanmak istemiyoruz. Bu nedenle, herhangi bir sütunun gürültü değil, yolun bir parçası olarak nitelendirilmesi için gereken minimum değer olacak bir eşik değeri belirleyeceğiz. Sabit kodlanmış bir değer belirleyebiliriz, ancak bunu canlı verilere dayanarak elde etmek daha iyidir.
  • Böylece maksimum toplam değeri bulacağız ve kullanıcı tanımlı yüzdemizi onunla çarparak eşik değerimizi oluşturacağız.Artık her bir tarafa tüm piksel sayısını ekleyebilir ve sol, sağ veya düz yönü bulabiliriz. Ama istediğimiz bu değil, eğer eğri doğruysa ne kadar doğru olduğunu bilmek isteriz. Eğriliğin değerini elde etmek için, eşiğimizden daha fazla değere sahip tüm sütunların indislerini bulacağız ve sonra indekslerimizin ortalamasını alacağız. Bu, piksel indekslerimiz 30'dan başlayıp 300'de biterse, ortalamamızın (300–30) / 2 +30 = 165 olacağı anlamına gelir. Temel değer artık imajımızın ortalama temel noktasıdır.
  • Daha iyi görselleştirmek için bu temel noktayı çizebiliriz.
Orta Nokta Çizimi

ve ilk orta nokta çıktımız aşşağıda gözüktüğü gibidir.

Orta Nokta Çıktı

4. Dönüşleri Optimize Etmek

Şimdi eğri değerini elde etmek için bu değeri merkezden çıkarabiliriz. Merkezin 240 olduğunu varsayarsak, eğri değeri 227–240 = -13 olur. Burada eksi işareti eğrinin sol tarafa doğru olduğunu ve 13 değeri eğrinin yoğunluğunu belirtir. Ancak daha önce tartıştığımız gibi, bu yöntem doğru değildir çünkü orta kısım değişebilir. Yani ortayı bulmak için az önce oluşturduğumuz işlevi kullanabilirsiniz, ancak bu sefer tam görüntü yerine histogram tekniğini görüntünün sadece alt 1/4 kısmına uygulayacağız. Bunun nedeni, tabanın ortalamasıyla ilgilendiğimiz için görüntünün 1 / 4'ünün üzerindeki piksellerin ortalamasını almak istemiyoruz. Bunu başarmak için, bölgenin bir girdi argümanı ekleyebiliriz ve bunun girdi değerine dayanarak tüm görüntünün veya bir kısmının ortalamasını alıp almayacağımıza karar verebiliriz.

Orta Bölge

Dolayısıyla, bölge 1 ise, tüm görüntü ortalama olacak ve bölge 4 ise, o zaman alttaki 4. bölümün ortalaması alınacaktır. Aşağıdaki resim alt kısmın ortalamasını göstermektedir.

Şimdi elde ettiğimiz ortalama değer 278. Bu, resmimizin gerçek merkezinin 240 yerine 278 olduğu anlamına geliyor. Şimdi bu orta noktadan daha önce aldığımız ortalama değerimizi çıkarabiliriz. yani 227–278 = -51. Daha önce değerimiz -13 idi ve şimdi -51 aldık. Eğri görüntüye baktığımızda, eğrinin yoğunluğunun yüksek olduğunu söyleyebiliriz, bu nedenle bu, ikinci yöntemin bize daha iyi sonuç verdiğini doğrular. Eğri değerine sahip olduğumuzda, onu bir listeye ekleyeceğiz, böylece bu değeri ortalayabiliriz. Ortalama alma, düzgün harekete izin verecek ve herhangi bir problemli dönüş gibi hareketten kaçınacaktır.

Engelleyici

Şimdi nihai sonucu görüntülemek için Görsellikler ekleyebiliriz. RaspbberryPi aynı anda görüntüleri çalıştırmaya çalışırsa çok yavaşlayacağından ana “getLaneCurve” işlevimize bir girdi bağımsız değişkeni ekleyeceğiz, böylece onu açma ve kapatma esnekliğine sahip olabiliriz.

Ve son olarak bütün Trackbarları ekrana çağırıp bütün ekranlar üzerinde kademe kademe nasıl işlendiğini izleyebileceğimiz ve şerit tanımlayan bir sistem.

5. Sonuç:

Yorumlarınıza ve eleştirilerinize açığım, zaman ayırıp okuduğunuz için teşekkür ederim.

Berk Karabillioğlu LunAI Founder & Data Scientist

--

--