Как изменяется матрица преобразования и матрица камеры при индексировании пикселей от -1 до 1 вместо 0 до N-1

Aug 20 2020

Я пытаюсь исказить кадры для синтеза представления. В частности, учитывая frame1 и позы frame1 и frame2, я пытаюсь деформировать frame1 в позу / вид frame2. Для этого я индексирую местоположения пикселей как$[0,M-1]$ и $[0,N-1]$для направлений y и x соответственно. Мой код работает отлично (кроме закрытых областей, которые приводят к дырам).

Я просматриваю этот документ по синтезу представлений . Код выпущен авторами вместо индекса пикселей в диапазоне$[-1,1]$. Непосредственное использование преобразований и матриц камеры дает неверные преобразованные координаты. Не могли бы вы объяснить, как мне изменить матрицы преобразования и камеры, чтобы они работали для индексов пикселей в диапазоне$[-1,1]$?

Подробнее :
я реализовал деформацию в Python, используя приведенные ниже уравнения. Учитывая расположение пикселя$p_1=[x,y]^T$

$$\hat{p}_1 = [x,y,1]^T$$ $$ P_1 = Z K^{-1} \hat{p}_1$$ $$ \hat{P}_1 = [P_1^T,1]^T $$ $$ \hat{P}_2 = T \hat{P}_1 $$ $$ P_2 = \hat{P}_2[0:3] $$ $$ \hat{p}_2 = K P_2 $$ $$ p_2 = \hat{p}_2[0:2] / \hat{p}_2[2] $$

$p_1$ это точка в кадре 1 и $p_2$ - соответствующая точка в кадре 2. $P_1$ - это трехмерная мировая точка с точки зрения frame1 и $P_2$ это та же трехмерная точка в кадре 2. $T$ это преобразование между видами frame1 и frame2. $Z$ истинная глубина точки $p_1$с учетом frame1. K - внутренняя матрица камеры. шапка ($\hat{p})$ используется для проективных координат.

Я вычисляю $4 \times 4$ матрица преобразования $T$ следующим образом: $$T = \begin{bmatrix} R & t \\ 0 & 1 \\ \end{bmatrix}$$ где $R$ матрица вращения и $t$ это перевод.

В $3 \times 3$ матрица камеры $K$ дан кем-то $$K = \begin{bmatrix} \frac{W/2}{tan(hfov/2)} & 0 & W/2 \\ 0 & \frac{H/2}{tan(vfov/2)} & H/2 \\ 0 & 0 & 1 \\ \end{bmatrix}$$ где $H=W=240$ высота и ширина рамок, $hfov=60,\ vfov=45$

Короче, какие изменения нужно внести в матрицы $T$ & $K$?

Ответы

NagabhushanSN Aug 23 2020 at 02:46

Прежде чем пытаться ответить на этот вопрос, давайте сначала посмотрим, что делает матрица преобразования камеры. Рассмотрим 3-ю точку

$$ P_1 = [X_1, Y_1, Z_1]^T $$

Предварительное умножение на матрицу камеры дает

$$ K \cdot P_1 = \begin{bmatrix} \frac{W/2}{tan(hfov/2)} & 0 & W/2 \\ 0 & \frac{H/2}{tan(vfov/2)} & H/2 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} X_1 \\ Y_1 \\ Z_1 \end{bmatrix} $$

$$ = \begin{bmatrix} \frac{W/2}{tan(hfov/2)} X_1 + W/2 \\ \frac{H/2}{tan(vfov/2)} Y_1 + H/2 \\ Z_1 \end{bmatrix} $$

Как мы можем видеть, $W/2$ в $K[1,1]$ Весы $x$ ценность и $W/2$ в $K[1,3]$добавляет смещение. Таким образом, если$x \in [-1,1]$ тогда с помощью этого масштабирования и смещения мы получаем $x \in [0,W]$.

И наоборот, когда $x \in [0,W]$, мы должны использовать матрицу камеры, как определено ранее. Следовательно, когда$x \in [-1,1]$, мы не должны добавлять масштабирование или смещение. Таким образом, нужно только изменить матрицу камеры на

$$K = \begin{bmatrix} \frac{1}{tan(hfov/2)} & 0 & 0 \\ 0 & \frac{1}{tan(vfov/2)} & 0 \\ 0 & 0 & 1 \\ \end{bmatrix}$$