Bir görüntünün yeniden boyutlandırılması gerçek kamera matrisini nasıl etkiler?


19

Boyut HxW görüntü için bilinen bir kamera matrisi (hem iç hem de dış parametreleri biliyorum) var. (Bu matrisi ihtiyacım olan bazı hesaplamalar için kullanıyorum).

Daha küçük bir görüntü kullanmak istiyorum, söyle: H2×W2 (orijinalin yarısı). Aynı ilişkiyi sürdürmek için matriste ne gibi değişiklikler yapmam gerekir?

Ben , içsel parametreler olarak K , ( R , dönüşü ve çeviri)T

cam=K[RT]

K=(ax0u00ayv0001)

K 3 * 3, ben , çarpmayı düşündümaxay ,u0 vev0 0,5(görüntünün yeniden boyutlandırıldığı faktör), ama emin değilim.

Yanıtlar:


13

Not: Bu, yeniden boyutlandırılan görüntüde hangi koordinatları kullandığınıza bağlıdır. Sıfır tabanlı sistem kullandığınızı varsayıyorum (örneğin C, aksine Matlab) ve 0, 0'a dönüştürülür. Ayrıca, koordinatlar arasında eğim olmadığını varsayıyorum. Eğer bir eğriliğiniz varsa, çarpım da olmalı

Kısa cevap : u = u olan bir koordinat sistemi kullandığınızı varsayarsaku=u2,v=v2 , evet,ax,ay,u0,v0değerini 0.5 ile çarpmalısınız.

Ayrıntılı cevap Dünya koordinatlarındaki bir P noktasını kamera koordinatlarına (x,y,z,1)>(u,v,S) fonksiyon:

(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Nerede (u,v,S)>(u/S,v/S,1) , çünkü koordinatlar homojendir.

Kısacası bu u = m 1 P şeklinde yazılabilir u=m1Pm3P,v=m2Pm3P Miki matrislerin ürünü olan, yukarıda sözü edilen vemImatris i'inci satırdırM. (Ürün skaler üründür).
MmiM

Görüntünün yeniden boyutlandırılması şu şekilde düşünülebilir:

u=u/2,v=v/2

Böylece

u=(1/2)M1PM3Pv=(1/2)M2PM3P

Matris formuna geri dönelim bize şunu verir:

(0.50000.50001)(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Which is equal to

(0.5ax00.5u000.5ay0.5v0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

For additional information, refer to Forsyth, chapter 3 - Geometric camera calibration.


Thanks a lot for the explanation !!! I'm just no so sure what you mean by zero-based system , I'm using matlab, do I need any other adjustments ?
matlabit

@matlabit, If you are using Matlab, you should use the transformation with u=(u1)/2+1,v=(v1)/2+1, since it has one-based indexing (First element is 1, not 0). Try to compute the relevant matrix in this case. If you do not need sub-pixel accuracy, you can just ignore it and use the formula I gave you.
Andrey Rubshtein

8

Andrey, çözümünün 0 olduğunu 0'a dönüştürdüğünü belirtti. Piksel koordinatları kullanıyorsanız, görüntüyü yeniden boyutlandırdığınızda bu muhtemelen doğru olmaz. Yapmanız gereken tek varsayım, görüntü dönüşümünüzün 3x3'lük bir matrisle (Andrey'nin gösterdiği gibi) temsil edilebileceğidir. Kamera matrisinizi güncellemek için görüntü dönüşümünüzü temsil eden matrisle önceden çarpabilirsiniz.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

Örnek olarak, bir görüntünün çözünürlüğünü bir faktöre göre değiştirmeniz gerektiğini varsayalım 2n0 dizinli piksel koordinatı kullanıyorsunuz. Koordinatlarınız ilişkiler tarafından dönüştürülür

x'=2n*(x+.5)-.5

y'=2n*(y+.5)-.5

bu matris ile temsil edilebilir

(2n02n-1-.502n2n-1-.5001)

son kamera matrisiniz

(2n02n-1-.502n2n-1-.5001)(birx0u00biryv0001)


Could you please elaborate why you add .5 and then subtract .5? Does 0.5 apply only to scaling w/ a factor 2n? If not, how does one compute that sub-pixel number?
Gurumonster

1
I think the point is that the center of pixel "0, 0" is not really at "0, 0" (=top left corner of the pixel) but at "0.5, 0.5". So you have to account for that offset before and after the transformation, and the factor is always 0.5, no matter the scaling factor.
Jan Rüegg

Yup thats exactly right
Hammer
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.