2017-02-21 60 views
2

Имея эту систему координат:Поворот изображения вокруг мира оси х

И это доминирующие вертикальные точки схода: enter image description here

Я хотел бы, чтобы повернуть изображение вокруг оси х так исчезающей точка находится на бесконечности. Это означает, что все вертикальные линии параллельны.

Я использую matlab. Я нахожу сегменты линий, используя LSD и точку схода, используя однородные координаты. Я хотел бы использовать представление по оси углов, а затем преобразовать его в матрицу вращения и передать это для imwarp и получить повернутое изображение. Также было бы полезно знать, как вращать сегменты. Сегменты имеют вид (x1, y1, x2, y2).

Изображение выше пример:

Vanishin точка в однородных координатах:

(x,y,z) = 1.0e+05 * [0.4992 -2.2012 0.0026] 

Vanishin точка в декартовых координатах (то, что вы видите на картинке):

(x,y) = [190.1335 -838.3577] 

Вопрос: С этим как я могу вычислить матрицу вращения в мировой оси x, как описано выше?

+0

вы хотите аффинное преобразование/гомография –

+0

Вы имеете в виду что-то вроде 'rotMat = vrrotvec2mat ([u, theta])'? –

+0

Это не работает. Я просто не знаю, как это сделать @Jon –

ответ

1

Если все, что вы делаете, поворачивает изображение так, чтобы вектор от начала координат до точки схода, вместо этого указывал прямо вертикально, вот пример.

I = imread('cameraman.tif'); 
figure;imagesc(I);set(gcf,'colormap',gray); 

vp=-[190.1335 -838.3577,0]; %3d version,just for cross-product use,-ve ? 
y=[0,1,0]; %The vertical axis on the plot 
u = cross(vp,y); %you know it's going to be the z-axis 
theta = -acos(dot(vp/norm(vp),y)); %-ve ? 
rotMat = vrrotvec2mat([u, theta]); 
J=imwarp(I,affine2d (rotMat)); 
figure;imagesc(J);set(gcf,'colormap',gray); %tilted image 

Вы можете играть с негативами и строить график, так как я не уверен в том, что касается тех частей, которые применимы к вашей ситуации. Негативы могут возникать из-за заговора с ног на голову или от вращения системы координат мира или камеры, но у меня нет времени думать об этом прямо сейчас.

EDIT

Если вы хотите, чтобы вращение вокруг оси Х, это может работать (адаптированный https://www.mathworks.com/matlabcentral/answers/113074-how-to-rotate-an-image-along-y-axis), или проверить: Rotate image over X, Y and Z axis in Matlab

[rows, columns, numberOfColorChannels] = size(I); 
newRows = rows * cos(theta); 
rotatedImage = imresize(I, [newRows, columns]); 
+0

Спасибо @Jon. Я уже пробовал это, но тогда affine2d дает проблемы: «Последний столбец матрицы аффинного преобразования должен состоять из нулей, кроме одного в последней строке». А матрица вращения: [-0,9752, 0,2212, -0,0104; -0,2212, -0,9752, -0,0012; -0.0104, 0.0012, 0.9999] –

+0

Как получить матрицу? Эта ошибка означает, что вы не вращаетесь вокруг оси z, а 'affine2d' может быть только 2D (иначе, только вокруг оси z). Матрица вращения, которую вы имеете, представляет собой трехмерное вращение вокруг всех осей, поэтому, полагаю, вам нужно посмотреть на 'affine3d' или использовать ссылку, на которую я указал внизу. –