1. 程式人生 > >世界座標、相機座標、影象座標、畫素座標的原理、關係,並用matlab模擬

世界座標、相機座標、影象座標、畫素座標的原理、關係,並用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; 

模擬結果:

 

注:

 

                                                                                                                 給學matlab的人,包括我自己一個勉勵:路漫漫其修,吾上下而求索