Ek Teori
Görüş Hedefleri
FRC oyun tasarımcıları genellikle sahaya stratejik konumlarda yansıtıcı "görüş hedefleri" yerleştirir. Bu görüş hedefleri genellikle retro-yansıtıcı banttan yapılır. Önemli puanlama elemanlarında genellikle otomatik nişan almak için kullanılabilecek görüş hedefleri bulunur. Aşağıda 2016 ve 2017 FRC oyunlarından bazı görüş hedeflerinin iki örneğini görebilirsiniz.

Bu retro-yansıtıcı görüş hedeflerinin çok kullanışlı bir özelliği vardır: üzerlerine ışık tutulduğunda, ışık doğrudan kaynağa geri yansır. Bu nedenle Limelight'ın kamera lensinin etrafında parlak yeşil LED'ler bulunur. Hedefe parlak yeşil ı şık yayarken kamera pozlamasını çok düşük ayarlayarak, çoğunlukla siyah olan ve parlak yeşil görüş hedefi içeren bir görüntü elde edebiliriz. Bu, hedefi yakalamayı nispeten kolay hale getirir.
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ğuna, ancak retro-yansıtıcı bantın parlak bir şekilde öne çıktığına dikkat edin.

Eşikleme
Eşikleme, çoğu FRC görüş takip algoritmasının bir sonraki kritik bileşenidir. Bir görüntü alıp belirli bir renk aralığında olmayan pikselleri atmaktır. Eşiklemenin sonucu genellikle bir pikselin ya "açık" ya da "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, parlak şekilde aydınlatılmış görüş hedefli çok karanlık görüntü) çok iyi çalışır.
Limelight, HSV (Ton-Doygunluk-Değer) renk uzayında eşikleme 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ılabilmesine benzer şekilde rengi temsil etmenin başka bir yoludur. HSV renk uzayını kullanmamızın nedeni, Ton'un Limelight'ın LED'lerinin yaydığı yeşil rengi çok hassas bir şekilde seçmek için kullanılabilmesidir.

Eşikleme ayarlarınızı görüntüden mümkün olduğunca fazlasını elemek için ayarlamanız kritik öneme sahiptir. Bir sonraki aşamaya geçmeden önce görüş hattınızın her aşamasını optimize ederseniz en iyi sonuçları alırsınız. Aşağıdaki görüntü, yanlış ve doğru eşikleme arasındaki farkı göstermektedir:

Bazen bir arenadaki tavan ışıkları veya pencereler gibi şeyleri eşikleme kullanarak görüntüden kaldırmak 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 kontur seti oluşturur. Kontur, bitişik bir piksel setini çevreleyen bir eğridir. Bazen tavan ışıkları, arena skorboardları, pencereler ve diğer şeyler eşikleme adımını geçebilir. Kontur filtrelemenin yararlı olduğu yer burasıdır. Amaç, ilgilendiğimiz hedef olmadığını bildiğimiz tüm konturları elemektir.
İlk ve en kolay kontur filtresi, puanlama mesafemizden görüş hedefimizin göründüğünden daha küçük olan konturları yok saymaktır. Bu boyuttan daha küçük olan herhangi bir şey açıkça daha uzakta bir şeydir ve yok sayılmalıdır. Buna alan filtreleme denir.
FRC görüş hedeflerinin genellikle konturları filtrelememize yardımcı olmak için kullanılabilecek bazı geometrik özellikleri vardır. Örneğin, görüş hedefinin geniş bir en-boy oranı varsa, geniş olmayan konturları filtreleyebiliriz:

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 yapıp görüş hedefini yok saymadığınızdan emin olmak için ayarlarınızı çeşitli açılardan test ettiğinizden emin olun!

Bu sonraki görüntü hedefi çok ilginçtir. FRC'deki en iyi tasarlanmış görüş hedeflerinden biridir (bizim görüşümüze göre). Limelight, bir konturun doluluk adı verilen bir değerini otomatik olarak 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 bu kadar düşük doluluklu tavan ışıkları, pencereler vb. neredeyse hiç görmezsiniz. Bu nedenle, görüş hedefiniz buna benziyorsa istenmeyen konturları çok etkili bir şekilde filtreleyebilirsiniz.

Limelight'ın konturları filtrelemek için birçok seçeneği vardır. Bu seçenekleri, takip etmeye çalıştığınız belirli görüş hedefinin geometri özellikleri hakkında bildiklerinizle birlikte kullanabilirsiniz.
Şu anda, birden fazla kontur filtreleme seçeneklerinizden geçerse, en büyük kontur seçilir. Ayrıca, hat 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 yararlıdır, ancak esasen nişan almak istediğimiz yer için bir piksel koordinatımız vardır. Bu hedefe açıları hesaplamak için biraz trigonometri kullanmamız gerekir.
Önce mükemmel bir "iğne deliği" kameramız olduğunu varsayıyoruz. Pratikte bu gerçekten uzak olabilir, ancak limelight'ın kamerası çok yakındır. (Karşı örnek olarak bir balıkgözü lens bu idealden uzak olurdu.)
Limelight kamerasının yatay görüş alanı 54 derece ve dikey görüş alanı 41 derecedir. 320x240 çözünürlükte görüntü yakalar. Görüntünün merkezinin kameranın optik ekseni olduğunu varsayıyoruz (yani o konum için x ve y açıları 0,0'dır). Bu bilinen değerler göz önüne alındığında, görüntüdeki herhangi bir piksel için açıları hesaplamak üzere biraz trigonometri kullanabiliriz.
Aşağıdaki diyagram, açılarını 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.
![]()
İlk adımımız piksel koordinatlarından, 0,0'ın görüntünün merkezi ve 1.0 olduğu normalleştirilmiş 2B koordinatlara dönüştürmek olacaktır:
(px, py) = piksel koordinatları, 0,0 sol üst köşedir, aşağı ve sağa doğru pozitif
(nx, ny) = normalleştirilmiş piksel koordinatları, 0,0 merkezdir, sağa ve yukarı doğru pozitif
nx = (1/160) * (px - 159.5)
ny = (1/120) * (119.5 - py)
Sonra hayali bir görüş düzlemi tanımlıyoruz ve 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 görüş düzlemi genişliğini ve yüksekliğini hesaplamaktır çünkü bu değerler daha sonra açıları hesaplamak için kullanılacaktır:
![]()
1.0 birim mesafe ve bilinen yatay ve dikey görüş alanı göz önüne alındığında, görüş düzlemi dikdörtgeninin boyutunu aşağıdaki formüllerle hesaplayabiliriz:
vpw = 2.0*tan(yatay_fov/2)
vph = 2.0*tan(dikey_fov/2)
Bu iki değeri kullanarak, artık basit bir çarpma ile normalleştirilmiş piksel koordinatları ve görüş düzlemi koordinatları arasında dönüşüm yapabiliriz.
x = vpw/2 * nx;
y = vph/2 * ny;
Görüş düzlemimizi 1.0 mesafede konumlandırmayı seçtiğimizi hatırlayın. Şimdi hedef noktasına açıları hesaplamak için ihtiyacımız olan her şeye sahibiz.
![]()
tan(ax) = x / 1
tan(ay) = y / 1
ax = atan2(x, 1)
ay = atan2(y, 1)