2017-02-21 2 views
2

이 좌표 시스템을 갖는 무한대에있다. 즉 모든 수직선은 평행합니다.회전 이미지

저는 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이 작동하지 않습니다. 난 그냥 어떻게 해야할지 모르겠다. @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 

귀하의 상황에 적용되는 부분에 대해서는 확실하지 않으므로 네거티브로 재생하고 플로팅 할 수 있습니다. 네거티브는 거꾸로 음모를 꾸미거나 세계 대 카메라 좌표계를 회전 시켜서 생길 수 있습니다. 그러나 지금 당장 그것에 대해 생각할 시간이 없습니다.

편집

당신이이 (https://www.mathworks.com/matlabcentral/answers/113074-how-to-rotate-an-image-along-y-axis에서 적응) 일 수있는 X 축을 중심으로 회전 또는 체크 아웃 할 경우 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

감사합니다. @ 존. 나는 이미 이것을 시도했지만 affine2d는 문제를 일으킨다. "아핀 변환 행렬의 마지막 열은 마지막 열의 행을 제외하고는 모두 0이어야합니다." 회전 행렬은 다음과 같습니다. [-0.9752, 0.2212, -0.0104; -0.2212, -0.9752, -0.0012; -0.0104, 0.0012, 0.9999] –

+0

매트릭스를 어떻게 구합니까? 이 에러는 여러분이 z 축을 중심으로 회전하지 않는다는 것을 의미하며, 'affine2d'는 2D (aka, z 축만) 일 수 있습니다. 당신이 가진 회전 행렬은 모든 축에 대한 3D 회전이므로'affine3d'를 보거나 맨 아래에있는 링크를 사용해야합니다. –