Як зміна розміру зображення впливає на внутрішню матрицю камери?


18

У мене є матриця камери (я знаю і внутрішні, і зовнішні параметри), відома за зображення розміру HxW. (Я використовую цю матрицю для деяких потрібних мені розрахунків).

Я хочу використовувати менший образ, скажімо: H2×W2 (половина оригіналу). Які зміни потрібно внести до матриці, щоб зберегти те саме відношення?

Я, K як внутрішні параметри, ( R , T обертання та переклад)

cam=K[RT]

K=(ax0u00ayv0001)

K 3 * 3, я думавпри множенніax ,ay ,u0 іv0 на 0,5 (коефіцієнт зображення було змінено розмір), але я не впевнений.

Відповіді:


13

Примітка. Це залежить від того, які координати ви використовуєте в розмірі зображення. Я припускаю, що ви використовуєте нульову систему (як C, на відміну від Matlab) і 0 перетворюється на 0. Крім того, я припускаю, що у вас немає перекосу між координатами. Якщо у вас є перекос, його також слід помножити

Коротка відповідь : Припустимо, що ви використовуєте систему координат, у якій u=u2,v=v2 , так, ви повинні помножитиax,ay,u0,v0 на 0,5.

Детальна відповідь Функція, яка перетворює точку P у світових координатах у координати камери (x,y,z,1)>(u,v,S) є:

(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Де (u,v,S)>(u/S,v/S,1) , оскільки координати однорідні.

Коротше кажучи, це можна записати як u=m1Pm3P,v=m2Pm3P
, деMявляє собою добуток двох матриць згадувалося вище, аmiє iму рядку матриціM. (Продукт скалярний продукт).

Повторне розмір зображення можна подумати:

u=u/2,v=v/2

Таким чином

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

Перетворення в матричну форму дає нам:

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

Який дорівнює

(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 mentioned that his solution assumes 0 is transformed to 0. If you are using pixel coordinates this is likely not true when you re-size the image. The only assumption you really need to make is that your image transformation can be represented by a 3x3 matrix (as Andrey demonstrated). To update your camera matrix you can just premultiply it by the matrix representing your image transformation.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

As an example, say you need to change the resolution of an image by a factor 2n and you are using 0 indexed pixel coordinates. Your coordinates are transformed by the relationships

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

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

this can be represented by the matrix

(2n02n1.502n2n1.5001)

so your final camera matrix would be

(2n02n1.502n2n1.5001)(ax0u00ayv0001)


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.