2017-02-21 247 views
2

有了这个坐标系:旋转图像

而这种主导垂直消失点: enter image description here

我想绕x轴旋转图像,从而消失点在无穷远处。这意味着所有的垂直线都是平行的。

我正在使用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,θ])''? – 2017-02-22 15:17:40

+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 

由于我不确定适用于您的情况的那些部件,因此您可以播放底片和绘图。负面情况可能来自上下颠倒,也可能来自世界与相机坐标系的旋转,但我现在没有时间考虑它。

编辑

如果你想绕X轴,这可能工作(改编自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.22212,-0.0104; -0.2212,-0.9752,-0.0012; -0.0104,0.0012,0.9999] –

+0

如何获得矩阵?这个错误意味着你不是围绕z轴旋转的,'affine2d'只能是2D(也就是说,只能围绕z轴)。你所拥有的旋转矩阵是关于所有轴的3D旋转,所以我想你必须看看'affine3d',或者使用我在底部指出的链接。 – 2017-02-25 04:46:51