有这个坐标系:
我想围绕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 :(得分: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]);