2012-08-26 136 views
1

我有一個攝像機和它的K矩陣(校準矩陣),我也有平面圖像,我知道4個角和他們對應像素的真實點。如果z = 0(H是圖像與真實平面之間的單應性矩陣),我知道如何計算H矩陣。 現在,我嘗試使用旋轉矩陣和轉換矢量來獲得平面(3D點)的真實點。我遵循本文:在第3 - 3.3節中由Raul Rojas校準高架攝像機。 我的代碼是:使用校準攝像機從4點成像恢復平面

ImagePointsScreen=[16,8,1;505,55,1;505,248,1;44,301,1;]; 

screenImage=imread('screen.jpg'); 
RealPointsMirror=[0,0,1;9,0,1;9,6,1;0,6,1]; %Mirror 
RealPointsScreen=[0,0,1;47.5,0,1;47.5,20,1;0,20,1];%Screen 
imagesc(screenImage); 
hold on 
for i=1:4 
    drawBubble(ImagePointsScreen(i,1),ImagePointsScreen(i,2),1,'g',int2str(i),'r') 
end 

Points3DScreen=Get3DpointSurface(RealPointsScreen,ImagePointsScreen,'Screen'); 

figure 
hold on 
plot3(Points3DScreen(:,1),Points3DScreen(:,2),Points3DScreen(:,3)); 
for i=1:4 
    drawBubble(Points3DScreen(i,1),Points3DScreen(i,2),1,'g',int2str(i),'r') 
end 



function [ Points3D ] = Get3DpointSurface(RealPoints,ImagePoints,name) 
M=zeros(8,9); 

for i=1:4 

M((i*2)-1,1:3)=-RealPoints(i,:); 
M((i*2)-1,7:9)=RealPoints(i,:)*ImagePoints(i,1); 
M(i*2,4:6)=-RealPoints(i,:); 
M(i*2,7:9)=RealPoints(i,:)*ImagePoints(i,2); 

end 

[U S V] = svd(M); 
X = V(:,end); 
H(1,:)=X(1:3,1)'; 
H(2,:)=X(4:6,1)'; 
H(3,:)=X(7:9,1)'; 
K=[680.561906875074,0,360.536967117290;0,682.250270165388,249.568615725655;0,0,1;]; 

newRO=pinv(K)*H; 
h1=newRO(1:3,1); 
h2=newRO(1:3,2); 

scaleFactor=(norm(h1)+norm(h2))/2; 
newRO=newRO./scaleFactor; 
r1=newRO(1:3,1); 
r2=newRO(1:3,2); 
r3=cross(r1,r2); 
r3=r3/norm(r3); 

R=[r1,r2,r3]; 

RInv=pinv(R); 
O=-RInv*newRO(1:3,3); 
M=K*[R,-R*O]; 
for i=1:4 
    res=pinv(M)* [ImagePoints(i,1),ImagePoints(i,2),1]'; 
    res=res'; 
    res=res*(1/res(1,4)); 
    Points3D(i,:)=res'; 

end 
Points3D(i+1,:)=Points3D(1,:); %just add the first point to the end of the array for draw square 

end 

我的結果是: enter image description here

現在我有兩個問題:

1,點1處(0,0,0),這是不真正的位置

2.點倒掛

我在做什麼撥錯?

+0

不是一個真正的編程題所給...也許你可以在[SE攝影](http://photo.stackexchange.com/)上查詢,[SE數學](http://math.stackexchange.com/),[SE信號處理](http:// dsp .stackexchange.com /)或[SE音頻和視頻製作](http://avp.stackexchange.com/)。 –

回答

0

我在文章中找到了答案:Raul Rojas在第3.3節中校準了一個高架攝像機。給定圖像中的四個點和它們在世界上的已知座標,可以恢復矩陣H,直到縮放因子爲止。我們知道第一個旋轉矩陣R的兩列必須是變換矩陣的前兩列。讓我們用h1,h2和h3表示矩陣H的三列 。由於縮放因子,我們得到: xr1 = h1 和 xr2 = h2 由於| r1 | = 1,那麼x = | h1 |/| r1 | = | h1 |和x = | h2 |/| r2 | = | h2 |。因此,我們可以計算該因子並從恢復的矩陣H中去除它。我們只需設置 H'= H/x 以這種方式,我們恢復旋轉矩陣R的前兩列。R的第三列可以是發現記住旋轉 矩陣中的任何列是其他兩列的交叉乘積(乘以適當的 加號或減號)。特別是 r3 = r1×r2 因此,我們可以從H中恢復旋轉矩陣R.我們還可以恢復平移向量(相機在場座標中的位置) 。只是 記得 h'3 = -R^T 因此相機針孔T的位置矢量被 T = -R^-1 H3

0

單應性通常是兩個位置/旋轉中的平面變換。 平面攝像機座標中的位置通常稱爲姿態或外部參數

opencv具有solvePnP()函數,該函數使用Ransac來估計已知平面的位置。

ps。對不起,不知道等價的matlab,但他的網站上的Bouguet has a matlab版本的openCV 3D功能

+0

請問我需要一個matlab解決方案 – Beno