Kameraya programlı olarak nereye işaret edeceğini nasıl söyleyebilirim?


8

Şu anda aklımda belirli bir kameram yok, bunun programlı / matematiksel olarak nasıl yapıldığını merak ediyorum.

Bir köşede kamera içeriye bakacak şekilde bir 3D alanım, bir dikdörtgenim var.
Bu dikdörtgen içinde geçerli konumunun (x, y, z) koordinatlarını ileten hareketli bir nesne var.
Bu koordinatları alıp kameranın bu konumu göstermesini söyleyen talimatlara çevirmek istiyorum.
Bu çeviri genellikle nasıl yapılır?


Oyun geliştiricilerinin oyun içi kameralarını nasıl kullandıklarına bakmak isteyebilirsiniz. Aynı prensip ve güneşin altındaki her şeyle uğraşmak zorundaydılar.
Harabeck

Nesnenin koordinatlarını gerçek 3D uzayda iletmek zorunda olmadığını, daha ziyade kameranın FOV'sunda bulunarak iletebileceğini belirtmek gerekir. Daha sonra, nesnenin çerçevede nerede olduğunu bulmak için desen tanımayı kullanırsınız ve sonra nesneyi ortalamak için kamerayı kaydırırsınız (veya birden çok karedeki konumdaki değişikliği izleyerek ve bu yönde hareket ederek başka bir şekilde bir hareket vektörünü 2B olarak tanımlarsınız). . Örneğin, sundurmadaki PTZ kameram, kaydırma hareketinden değil hareket arayan sundurmayı tarar ve hareket duruncaya kadar hareketli öğeyi kilitler ve takip eder.
dannysauer

Kullanım durumum bir spor analiz sistemidir, her oyuncu sahada geçerli konumu, hızı vb. İleten bir etiket giyiyor. Yani konum bilgimiz zaten var. Kesinlikle bir örüntü tanıma göz atacağım. Kulağa faydalı geliyor.
bot_bot

Yanıtlar:


10

Trigonometri!

Kameram bir DLink 5020-L ve bir API aracılığıyla verilebilen pan / tilt komutlarına sahip . Ayrıca, önceden ayarlanmış konumlara sahiptir ve API aracılığıyla da tetiklenebilir

Ön init

  • Kameranızın konumunu 0 ° Pan ve 0 ° Tilt olarak referansınızda tanımlayın => bu konumu arayacağız Position 1

İçinde

  • Kameranızı şuraya taşıyın: Position 1
  • 0 başlatılmış değişkenlerde veya API'nız aracılığıyla kameranızın pan / eğimini bir yerde saklayın

Nesneye bak

  • Nesnenizi X, Y ve Y, Z düzlemlerinde iki düzlemde bulun
  • Ardından pan (sol / sağ) açısını elde edebilirsiniz (bir IoT SE'de omg matematik formülleri!)

$$ \ arctan \ Bigg (\ frac {y} {x} \ Bigg) $$

  • Sonra eğim (yukarı / aşağı) açısını elde edebilirsiniz

$$ \ arctan \ Bigg (\ frac {z} {y} \ Bigg) $$

  • Göreceli hareketle çalışabileceğiniz için yeni kaydırma / eğme değerini kaydetmeyi / güncellemeyi unutmayın ...

Kameranızın nasıl yerleştirildiğine bağlı olarak önceki sonuçları reddedebilirsiniz

(Zamanım olduğunda bazı şemalar ekleyeceğim)


2
@Hardillb tarafından dövüldü;) Ve daha iyi görünümlü formülleri var ...
Goufalite

2
Maalesef LaTeX desteği bu sitede mevcut değil. İsterseniz, CodeCogs gibi bir yerden bir görüntünün yerine bir görüntüye aktarabilirsiniz. (Bunu sizin için yaptım; gerektiği gibi düzenlemek veya istemiyorsanız kaldırmaktan çekinmeyin!)
Aurora0001

İkiniz de yardımınız için teşekkürler. Tam da aradığım şey buydu.
bot_bot

Sanırım eğim açısı için arktanın hipotenüs üzerindeki z bileşenine göre olması gerektiğini dikkate aldınız: kamerayı y bileşeninin üzerine koymak, kamera yetersiz olacağından kameranızı yeterince yükseltebilir / düşürebilir. y ekseni ile değil, y bileşeni ile x bileşeni arasındaki sağ üçgenin hipotenüsü boyunca işaret etti. Yanlışsam düzelt. :) Harika bir cevap olsa.
anonymous2

@ anonymous2 de benim düşüncemdi. Sunulan cevapların hiçbirinin gerçekten doğru olduğunu düşünmüyorum, ancak şu anda bunu göstermek için bant genişliğim yok - değişken (pan veya tilt) almak için iki üçgen ve üç koordinatın hepsine ihtiyacınız var gibi görünüyor. Bunu iki farklı uç örneği görselleştirerek kendinize kanıtlayabilirsiniz: 1,1,999'luk x, y, z, 1,1,1'den çok farklı farklı pan ve çok farklı eğim verecektir. Goufalite'nin cevabı her ikisi için de aynı tavayı verir.
dwizum

6

Harika cevaplar zaten, göz önünde bulundurmanız gereken birkaç şey daha eklemek istiyorum. Hardlib ve Goufalite'nin daha önce bahsettiği gibi, bunu yapmanın yolu trigonometriktir. Kameranın ve IoT nesnesinin 2 boyutlu tasvirini çıkardım:

resim açıklamasını buraya girin

Gördüğünüz gibi, kameranın görüş alanı nesneden daha büyük olacaktır - yakın mesafeden değilse, nesne daha uzaklaştığında.

Şimdi, olabilecek kamera her zaman nesne merkezli istiyorum. Bu durumda, hardlib'in referans aldığı hesaplamaları yapabilirsiniz:

ϴ = arctan(y/x)

... kurallara göre x ekseninden saat yönünün tersine açı olacak. Ayrıca seviyeden uzak açıya da ihtiyacınız olacak:

α = arctan(z / ((y^2+x^2)^1/2))

Açıkçası, üç eksenin hepsinde başlangıç ​​noktasında olan kamera konumundan yola çıkarak hesaplamanız gerekecektir.

Öte yandan, kamerayı gereğinden fazla hareket ettirmemeyi tercih edebilirsiniz, yani kameranın yalnızca nesnenin çerçeveden çıkmak üzere olduğu anlaşıldığında hareket etmesini tercih edebilirsiniz. Bu durumda, muhtemelen nesnenin çerçevenin kenarına ne kadar yakın olduğuna bağlı olarak kamerayı açısını değiştirme olasılığını artıracak bir "basınç" değişkeni isteyeceksiniz.

Bu rotaya giderseniz, nesnenin kameranın görüş alanıyla nerede karşılaştırılacağını belirleyebilmeniz için her iki görüş alanında da kameranın görüş alanının açısını bilmeniz gerekir.


Bu harika! Teşekkürler, şu anda nesneyi kameraların görüş alanında ortalamak istiyorum.
bot_bot


İyi bir nokta - bu kesinlikle dikkate alınması gereken bir şey.
anonymous2

5

Bu normalde temel trigonometri ile yapılır .

Fotoğraf makinesi başlangıç ​​noktasında (0,0) ve nesne (x, y) konumundayken tek bir 2d düz düzlem üzerinde çalışarak başlayın

X mesafesinin üçgenin bitişik tarafı olacağı ve y mesafesinin alacağınızın tam tersi olacağı göz önüne alındığında:

tan (açı) = y / x

böylece pan açısı

Açı = invTan (y / x)

Ayrıca, kamera ile nesne arasındaki düz çizgi mesafesini (hipotenüsler) aşağıdakilerle çalışabilirsiniz:

h ^ 2 = x ^ 2 + y ^ 2

Giving:

h = sqrt (x ^ 2 + y ^ 2)

Artık eğim açısını aynı şekilde hesaplamak için h mesafesini z yüksekliği ile kullanabilirsiniz.

Açılara sahip olduktan sonra, bunları kameradaki pan / tilt'i kontrol eden şeye besleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.