Jak zmiana rozmiaru obrazu wpływa na wewnętrzną matrycę kamery?


18

Mam matrycę kamery (znam zarówno parametry wewnętrzne, jak i zewnętrzne) znane z obrazu o wielkości HxW. (Używam tej macierzy do niektórych obliczeń, których potrzebuję).

Chcę użyć mniejszego obrazu, powiedz: (połowa oryginału). Jakie zmiany muszę wprowadzić w matrycy, aby zachować tę samą relację?H.2)×W.2)

Mam, jako parametry wewnętrzne, ( , T obrót i translacja)R TKRT

cam=K[RT]

K=(ax0u00ayv0001)

K to 3 * 3, myślałem o pomnożeniu ax , ay , u0 i v0 przez 0,5 (współczynnik zmiany rozmiaru obrazu), ale nie jestem pewien.

Odpowiedzi:


13

Uwaga: To zależy od współrzędnych używanych w obrazie o zmienionym rozmiarze. Zakładam, że używasz układu zerowego (jak C, w przeciwieństwie do Matlab), a 0 jest przekształcane na 0. Ponadto, zakładam, że nie masz skosu między współrzędnymi. Jeśli masz przekrzywienie, należy je również pomnożyć

Krótka odpowiedź : Zakładając, że używasz układu współrzędnych, w którym , tak, powinieneś pomnożyć przez 0,5u=u2),v=v2)zax,zay,u0,v0

Szczegółowa odpowiedź Funkcja, która przekształca punkt we współrzędnych świata na współrzędne kamery to:P.(x,y,z,1)->(u,v,S.)

(zax0u00zayv0001)(R11R12R13T.xR21R22R23T.yR31R32R33T.z0001)(xyz1)

Gdzie , ponieważ współrzędne są jednorodne.(u,v,S.)->(u/S.,v/S.,1)

W skrócie można to zapisać jako gdzie jest iloczynem dwóch wspomnianych powyżej matryc, a jest i ' ty rząd macierzy . (Produkt jest produktem skalarnym).u=m1P.m3)P.,v=m2)P.m3)P.
M.mjaM.

Można zmienić rozmiar obrazu:

u=u/2,v=v/2

A zatem

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

Konwersja z powrotem do postaci macierzowej daje nam:

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

Co jest równe

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

Aby uzyskać dodatkowe informacje, patrz Forsyth , rozdział 3 - Kalibracja kamery geometrycznej.


Wielkie dzięki za wyjaśnienie !!! Po prostu nie jestem pewien, co masz na myśli mówiąc o systemie zerowym, używam Matlaba, czy potrzebuję innych korekt?
matlabit

@matlabit, jeśli używasz Matlaba, powinieneś użyć transformacji , ponieważ ma ona indeksowanie oparte na jednym (Pierwszy element ma wartość 1, a nie 0). W takim przypadku spróbuj obliczyć odpowiednią macierz. Jeśli nie potrzebujesz dokładności subpikseli, możesz ją zignorować i użyć wzoru, który ci dałem. u=(u1)/2+1,v=(v1)/2+1
Andrey Rubshtein

8

Andrey wspomniał, że jego rozwiązanie zakłada, że ​​0 jest przekształcone na 0. Jeśli używasz współrzędnych pikseli, prawdopodobnie nie jest to prawdą po zmianie rozmiaru obrazu. Jedynym założeniem, które naprawdę musisz przyjąć, jest to, że transformacja obrazu może być reprezentowana przez matrycę 3x3 (jak pokazał Andrey). Aby zaktualizować matrycę kamery, możesz po prostu przedwcześnie zastosować macierz reprezentującą transformację obrazu.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

Na przykład powiedz, że musisz zmienić rozdzielczość obrazu o współczynnik i używasz 0 indeksowanych współrzędnych pikseli. Twoje współrzędne są przekształcane przez relacje2)n

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

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

może to być reprezentowane przez macierz

(2)n02)n-1-.502)n2)n-1-.5001)

więc twoja ostatnia matryca kamery będzie

(2)n02)n-1-.502)n2)n-1-.5001)(zax0u00zayv0001)


2)n

1
Myślę, że chodzi o to, że środek piksela „0, 0” nie jest tak naprawdę ustawiony na „0, 0” (= lewy górny róg piksela), ale na „0,5, 0,5”. Musisz więc uwzględnić to przesunięcie przed i po transformacji, a współczynnik wynosi zawsze 0,5, bez względu na współczynnik skalowania.
Jan Rüegg

Tak, dokładnie tak
Hammer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.