世界座標、相機座標、影象座標、畫素座標的原理、關係,並用matlab模擬
世界座標、相機座標、影象座標、畫素座標的原理、關係,並用matlab模擬
照相機是日常生活中最常見的。它能把三維的空間圖片等比例縮小投影在照片上,稱為一個二維影象。
以下我們就講一講原理,並相應的進行matlab模擬。
在學之前,先要了解幾個概念:
- 什麼是世界座標?
- 也就是真實世界的立體空間座標,是一個三維座標系
- Ow-XwYwZw :世界座標系,描述相機位置,單位m
- 什麼是相機座標?
- 根據透鏡成像原理,將世界座標在照相機內呈現,是一個三維座標系
- Oc-XcYcZc :相機座標系,光心為原點,單位m
- 什麼是影象座標?
- 將相機呈現的三維座標投影到螢幕上,而建立的新座標系,不含高程資訊,是一個二維座標系
- o-xy :影象座標系,原點為成像平面中點,單位mm
- 什麼是畫素座標?
- 將投影的影象座標離散抽樣形成的做種圖片,是一個二維的座標系
- uv :畫素座標系,原點為影象左上角,單位pixel
所以步驟流程就是:
-
- step1:將世界座標轉化為相機座標,等比例縮小,外加旋轉平移,稱之為剛體變換;
- step2:將相機座標轉化為影象座標,稱為投影
- step3:將影象座標離散抽樣
模型如下圖所示:
step1:構造rigbt()函式
世界座標轉化為相機座標模型如下圖所示:
從世界座標系變換到相機座標系屬於剛體變換:即物體不會發生形變,只需要進行旋轉和平移。
R:表示旋轉矩陣
T:表示偏移向量
接下來分析旋轉和平移
座標軸繞z軸旋轉 θ=Theta(希臘字母讀法,程式設計用的到),其幾何模型如下圖所示:
公式滿足:
矩陣形式為:
同理,繞x、y軸可以寫成:
所以剛體變化中旋轉變換R=R1R2R3。
平移矩陣T,則剛體變換可以寫成:
進一步轉化,可以寫成4階矩陣:
R矩陣是一個3×3矩陣,T是一個3×1矩陣,RT是一個4×4矩陣。
matlab 模擬:
function [RT] = rigbt(Phi, Psi, Theta, x0, y0, z0)
%剛體變換函式:rigid body transformation
%輸入引數:
% φ=Phi 繞x軸轉動的角度
% ψ=Psi 繞y軸轉動的角度
% θ=Theta 繞z軸轉動的角度
%輸出引數:
% RT 將座標軸進行剛體變化(旋轉+平移)成新的座標軸
%
%% 程式
R1 = [1 0 0; 0 cos(Phi) sin(Phi); 0 -sin(Phi) cos(Phi)];%繞X軸旋轉
R2 = [cos(Psi) 0 -sin(Psi); 0 1 0; sin(Psi) 0 cos(Psi)];%繞Y軸旋轉
R3 = [cos(Theta) sin(Theta) 0;-sin(Theta) cos(Theta) 0; 0 0 1 ];%繞Z軸旋轉
R = R3 * R1 * R2;%旋轉矩陣(剛體變換一部分)
T = [x0; y0; z0];%平移矩陣
RT=[R T;0 0 0 1];%剛體變換矩陣
return
step2:構造proj()函式
相機座標投影成影象座標,幾何模型如下圖所示:
幾何關係(相似)滿足:
即:
代入:
寫成矩陣形式:
matlab 模擬:
function [Projection_Matrix] = proj(f)
%相機座標投影(projection)成影象座標
%輸入引數
% f 相機焦距(數,cm)
%輸出引數
% Projection_Matrix 投影成像(矩陣)
Projection_Matrix = [f 0 0 0; 0 f 0 0; 0 0 1 0];
return
step3:構造pixel()函式
xoy是影象座標; uo_{uv}v是畫素座標; (u0,v0)是畫素座標的中心; p(x,y)是影象中的任意一點。
模型如下:
將x、y分成n份,每份長度為dx、dy。
則幾何公式為:
轉化為矩陣形式:
matlab模擬:
function [Pixel_Matrix] = pixel(dx,dy,u0,v0)
%影象座標離散化,轉化為畫素座標
%輸入引數:
% dx x軸方向上解析度,畫素大小
% dy y軸方向上解析度,畫素大小
% (u0,v0) 參考座標,影象平面中心
if nargin==2
u0 = 0;
v0 = 0;
end
Pixel_Matrix = [1/dx 0 u0; 0 1/dy v0; 0 0 1];
return
step4:前三步整合
公式中, fx=f/dx,fy=f/dy。
matlab 主程式
% 將世界座標轉化為畫素座標的引數
%% 程式
clear all;close all; clc;
% 引數
Phi = pi/4;%繞x軸旋轉角度
Psi = pi/4;%繞y軸旋轉角度
Theta = pi/4;%繞z軸旋轉角度
x0 = 0;%x平移量
y0 = 0;%y平移量
z0 = 0;%z平移量
f = 35e-3;%35mm相機
dx = 0.026;%一個畫素的長
dy = 0.026;%一個畫素的寬
u0 = 0;%影象平面中心
v0 =0;%影象平面中心
%% step1:將世界座標轉化為相機座標,等比例縮小,外加旋轉平移(剛體變換)
RT = rigbt(Phi, Psi, Theta, x0, y0, z0);%剛體變換矩陣
%% step2:將相機座標轉化為影象座標(投影)
Projection_Matrix = proj(f);%投影矩陣
%% step3:將影象座標離散抽樣
Pixel_Matrix = pixel(dx,dy,u0,v0);%1畫素=0.635釐米÷24≈0.026458釐米
%% 資料整合
Camera_Internal_Parameters = Pixel_Matrix * Projection_Matrix;%相機內參數
Camera_External_Parameters = RT;%相機外引數
%清除不用的變數
clearvars -except Camera_Internal_Parameters Camera_External_Parameters
%相機引數
Camera_Parameters = Camera_Internal_Parameters*Camera_External_Parameters
clearvars -except Camera_Parameters%清除變數
模擬結果:
擴充套件:
實際應用中,往往將上面的主程式main製作成一個相機引數函式camera_ parameters(),更有利於呼叫。可以用下面相機引數函式一個代替上面的main程式。
matlab 模擬
function [Camera_Parameters] = camera_parameters()
% 將世界座標轉化為畫素座標的引數(相機引數矩陣)
% 引數,可以省,省去的話,必須設定相應的入參
Phi = pi/4;%繞x軸旋轉角度
Psi = pi/4;%繞y軸旋轉角度
Theta = pi/4;%繞z軸旋轉角度
x0 = 0;%x平移量
y0 = 0;%y平移量
z0 = 0;%z平移量
f = 35e-3;%35mm相機
dx = 0.026;%一個畫素的長
dy = 0.026;%一個畫素的寬
u0 = 0;
v0 =0;
%% step1:將世界座標轉化為相機座標,等比例縮小,外加旋轉平移(剛體變換)
RT = rigbt(Phi, Psi, Theta, x0, y0, z0);%剛體變換矩陣
%% step2:將相機座標轉化為影象座標(投影)
Projection_Matrix = proj(f);%投影矩陣
%% step3:將影象座標離散抽樣
Pixel_Matrix = pixel(dx,dy,u0,v0);%1畫素=0.635釐米÷24≈0.026458釐米
%% 資料整合
Camera_Internal_Parameters = Pixel_Matrix * Projection_Matrix;%相機內參數
Camera_External_Parameters = RT;%相機外引數
%相機引數
Camera_Parameters = Camera_Internal_Parameters*Camera_External_Parameters;
模擬結果:
注:
- 程式中好多引數是本人找的,有的引數,我簡單化了。也可以改引數執行。
- 本文參考了:https://download.csdn.net/download/chentravelling/9833120
- 本部落格文件下載地址:https://download.csdn.net/download/weixin_41649786/10629546
- 本部落格程式碼下載地址:https://download.csdn.net/download/weixin_41649786/10629733
給學matlab的人,包括我自己一個勉勵:路漫漫其修遠兮,吾將上下而求索