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ştirir. Bu görüş hedefleri genellikle retro-yansıtıcı banttan yapılı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 bazı görüş hedefi örneklerini görebilirsiniz.

Görüş Hedefi Örnekleri

Bu retro-yansıtıcı görüş hedefleri çok kullanışlı bir özelliğe sahiptir: ü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 doğru parlak bir yeşil ışık yayarken kamera pozlamasını çok düşük ayarlayarak, çoğunlukla siyah olan ve parlak yeşil bir görüş hedefi içeren bir görüntü elde edebiliriz. Bu, hedefi elde etme 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 Örneği 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 atmak anlamına gelir. 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ış bir görüş hedefi) çok iyi çalışır.

Limelight, eşiklemeyi HSV (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 çok şeyi elemek 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 bir arenadaki 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. Bir 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 göründüğünden daha küçük olan konturları göz ardı etmektir. Bu boyuttan daha küçük olan her şey açıkça daha uzakta bir şeydir ve göz ardı edilmelidir. Buna alan filtreleme denir.

FRC görüş hedefleri genellikle konturları filtrelemek için kullanılabilecek 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öz ardı etmediğ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ç. 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 şekil çok düşük bir doluluğa sahiptir 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şmeyi önlemeye yardımcı olan bir özelliktir.

Piksellerden Açılara

Görüş hattının son sonucu, görüntüdeki en iyi konturun piksel konumudur. Çoğu oyun için, konturun merkezine nişan almamız yeterlidir. Bazen üst-merkeze veya başka bir noktaya nişan almak da faydalı olabilir, ancak esasen nişan almak istediğimiz yerin 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 çok uzak olabilir, ancak limelight'ın kamerası buna çok yakındır. (Bir balık gözü lens, karşı örnek olarak bu idealden çok uzak olurdu.)

Limelight kamerası 54 derecelik yatay görüş alanına ve 41 derecelik dikey görüş alanına sahiptir. Görüntüleri 320x240 çözünürlükte yakalar. Görüntünün merkezinin kameranın optik ekseni olduğunu varsayıyoruz (yani bu konum için x ve y açıları 0,0'dır). Bu bilinen değerleri kullanarak, 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 üst köşedir, 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ı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, 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 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(yatay_fov/2)

vph = 2.0*tan(dikey_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 unutmayı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(1, x)

ay = atan2(1, y)