2017-02-21 310 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