Ana içeriğe geç

Ek Teori

Görüş Hedefleri

FRC oyun tasarımcıları genellikle sahada stratejik konumlara yansıtıcı "görüş hedefleri" yerleştirirler. Bu görüş hedefleri genellikle retro-yansıtıcı banttan yapılmıştır. Önemli skor elementlerinin genellikle otomatik nişan almak için kullanılabilecek görüş hedefleri vardır. Aşağıda 2016 ve 2017 FRC oyunlarından görüş hedeflerine iki örnek görebilirsiniz.

Görüş Hedefi Örnekleri

Bu retro-yansıtıcı görüş hedeflerinin çok faydalı bir özelliği vardır: üzerlerine ışık tutulduğunda, ışığı doğrudan kaynağına geri yansıtırlar. Bu yüzden Limelight'ın kamera lensinin etrafında parlak yeşil LED'ler bulunur. Hedefe parlak yeşil ışık yayarken kamera pozlamasını çok düşük tutarak, çoğunlukla siyah ve parlak yeşil görüş hedefinden oluşan bir görüntü elde edebiliriz. Bu, hedefi algılama işini nispeten kolaylaştırır.

Burada ideal görüntünün bir örneğini görebilirsiniz. Düşük pozlama ayarı nedeniyle görüntüdeki neredeyse tüm detayların kaybolduğunu, ancak retro-yansıtıcı bandın parlak bir şekilde öne çıktığını fark edin.

Görüş Hedefi Örnek 2


Eşikleme

Eşikleme, çoğu FRC görüş izleme algoritmasının bir sonraki kritik bileşenidir. Bir görüntü alıp belirli bir renk aralığında olmayan pikselleri atma işlemidir. Eşiklemenin sonucu genellikle bir pikselin "açık" veya "kapalı" olduğu tek boyutlu bir görüntüdür. Eşikleme, yukarıdaki strateji kullanılarak yakalanan görüntülerde (düşük pozlama, çok karanlık görüntü ve parlak aydınlatılmış görüş hedefi) çok iyi çalışır.

Limelight, eşiklemeyi HSV (Hue-Saturation-Value / Ton-Doygunluk-Değer) renk uzayında yapar. Renkleri RGB (Kırmızı-Yeşil-Mavi) renk uzayında düşünmeye alışkın olabilirsiniz. HSV, kartezyen koordinatlar veya kutupsal koordinatların konumları tanımlamak için kullanılabilmesi gibi, rengi temsil etmenin başka bir yoludur. HSV renk uzayını kullanmamızın nedeni, Ton'un Limelight'ın LED'lerinin çıkardığı yeşil rengi çok sıkı bir şekilde seçmek için kullanılabilmesidir.

HSV Görüntüsü

Görüntüden mümkün olduğunca fazla şeyi ortadan kaldırmak için eşikleme ayarlarınızı düzenlemeniz çok önemlidir. Görüş hattınızın her aşamasını bir sonraki aşamaya geçmeden önce optimize ederseniz en iyi sonuçları alırsınız. Aşağıdaki görüntü, uygun olmayan ve uygun eşikleme arasındaki farkı göstermektedir:

Eşikleme Örneği

Bazen arena içindeki tavan ışıkları veya pencereler gibi şeyleri eşikleme kullanarak görüntüden çıkarmak zor olabilir, bu da bizi bir sonraki aşamaya getirir.


Kontur Filtreleme

Eşiklemeden sonra, Limelight'ın görüş hattı görüntü için bir dizi kontur oluşturur. Kontur, bitişik piksel kümesini çevreleyen bir eğridir. Bazen tavan ışıkları, arena skor tabloları, pencereler ve diğer şeyler eşikleme adımını geçebilir. İşte burada kontur filtreleme faydalı olur. Amaç, ilgilendiğimiz hedef olmadığını bildiğimiz konturları elemektir.

İlk ve en kolay kontur filtresi, görüş hedefimizin skor mesafemizden nasıl göründüğünden daha küçük olan konturları görmezden gelmektir. Bu boyuttan daha küçük olan herhangi bir şey açıkça daha uzakta bir şeydir ve göz ardı edilmelidir. Buna alan filtreleme denir.

FRC görüş hedefleri genellikle konturları filtrelememize yardımcı olabilecek bazı geometrik özelliklere sahiptir. Örneğin, görüş hedefi geniş bir en-boy oranına sahipse, geniş olmayan konturları filtreleyebiliriz:

Hedef

Ancak, kameranızın hedefe garip bir açıdan bakıyor olabileceğini unutmayın. Bu, konturunun en-boy oranını önemli ölçüde etkileyebilir. Çok agresif filtreleme yapmadığınızdan ve görüş hedefini görmezden gelmediğinizden emin olmak için ayarlarınızı çeşitli açılardan test ettiğinizden emin olun!

Hedef

Bu bir sonraki görüntü hedefi çok ilginçtir. Bu, FRC'deki en iyi tasarlanmış görüş hedeflerinden biridir (bizim görüşümüze göre). Limelight otomatik olarak bir konturun doluluk adı verilen bir değerini hesaplar. Doluluk, konturun piksel alanının dışbükey alanına oranıdır. Bu özel şeklin çok düşük bir doluluğu vardır ve neredeyse hiçbir zaman bu kadar düşük doluluğa sahip tavan ışıkları, pencereler vb. görmezsiniz. Bu nedenle, görüş hedefiniz buna benziyorsa, istenmeyen konturları çok etkili bir şekilde filtreleyebilirsiniz.

Hedef

Limelight'ın konturları filtrelemek için birçok seçeneği vardır. Bu seçenekleri, izlemeye çalıştığınız belirli görüş hedefinin geometrik özellikleri hakkında bildiklerinizle birlikte kullanabilirsiniz.

Şu anda, birden fazla kontur filtreleme seçeneklerinizden geçerse, en büyük kontur seçilir. Ek olarak, pipeline histerezis kullanarak konturlara "kilitlenmeyi" tercih eder. Bu, benzer hedefler arasında titreşimi önlemeye yardımcı olan bir özelliktir.

Piksellerden Açılara

Görüş hattının nihai sonucu, görüntüdeki en iyi konturun piksel konumudur. Çoğu oyun için, konturun merkezine nişan alabiliriz. Bazen üst-merkeze veya başka bir noktaya nişan almak da faydalı olabilir, ancak esasen nişan almak istediğimiz yer için bir piksel koordinatına sahibiz. Bu hedefe olan açıları hesaplamak için biraz trigonometri kullanmamız gerekiyor.

İlk olarak mükemmel bir "iğne deliği" kameraya sahip olduğumuzu varsayıyoruz. Pratikte bu gerçekten uzak olabilir, ancak limelight'ın kamerası buna çok yakındır. (Balık gözü lens, bir karşı örnek olarak bu idealden uzak olacaktır.)

Limelight kamerasının 54 derecelik yatay görüş alanı ve 41 derecelik dikey görüş alanı vardır. 320x240 çözünürlükte görüntü yakalar. Görüntünün merkezinin kameranın optik ekseni olduğunu varsayıyoruz (bu nedenle bu konum için x ve y açıları 0,0'dır). Bu bilinen değerlerle, görüntüdeki herhangi bir piksel için açıları hesaplamak için biraz trigonometri kullanabiliriz.

Aşağıdaki diyagram, açıları hesaplamak istediğimiz örnek bir hedef noktasını göstermektedir. Piksel koordinatları görüntünün sol üst köşesinden başlar ve sağa ve aşağıya doğru pozitiftir.

Piksellerden Açılara

İlk adımımız, piksel koordinatlarını, 0,0'ın görüntünün merkezi olduğu ve 1.0 olan normalize edilmiş 2D koordinatlara dönüştürmek olacaktır:

(px, py) = piksel koordinatları, 0,0 sol üsttedir, aşağı ve sağa doğru pozitiftir

(nx, ny) = normalize edilmiş piksel koordinatları, 0,0 merkezdir, sağa ve yukarı doğru pozitiftir

nx = (1/160) * (px - 159.5)

ny = (1/120) * (119.5 - py)

Sonra hayali bir görüş düzlemi tanımlayıp boyutunu hesaplıyoruz. Basitlik için, bu düzlemi kamera konumunun 1.0 birim önüne yerleştirmeyi seçebiliriz. İşte kameraya yukarıdan bakan bir görünüm. Amacımız, daha sonra açıları hesaplamak için kullanılacak olan görüş düzlemi genişliğini ve yüksekliğini hesaplamaktır:

Piksellerden Açı Normalize Koordinatları

1.0 birimlik bir mesafe ve bilinen bir yatay ve dikey görüş alanı verildiğinde, görüş düzlemi dikdörtgeninin boyutunu aşağıdaki formüllerle hesaplayabiliriz:

vpw = 2.0*tan(horizontal_fov/2)

vph = 2.0*tan(vertical_fov/2)

Bu iki değeri kullanarak, normalize edilmiş piksel koordinatları ile görüş düzlemi koordinatları arasında basit bir çarpma ile dönüşüm yapabiliriz.

x = vpw/2 * nx;

y = vph/2 * ny;

Görüş düzlemimizi 1.0 mesafesinde konumlandırmayı seçtiğimizi hatırlayın. Şimdi hedef noktaya olan açıları hesaplamak için ihtiyacımız olan her şeye sahibiz.

Piksellerden Açı Hesaplama

tan(ax) = x / 1

tan(ay) = y / 1

ax = atan2(x, 1)

ay = atan2(y, 1)