1. 程式人生 > >攝像頭影象失真校正

攝像頭影象失真校正

基於MATLAB的攝像頭

影象失真校正

     上學的時候玩智慧車攝像頭組,從發現影象失真、到下載研究各種文件、再到寫程式測試、最後實際運用,整個過程很有意思,特別是逆透視變換值得研究。下面的內容是那時候寫的MATLAB結課作業,實際運用到K60微控制器程式中,是用MATLAB生成影象失真的校正表和反校正表:

//用影象畫素定位物理座標X
const int16 IMG_X[ROW][COL]

//用影象畫素定位物理座標Y 

const int16 IMG_Y[ROW][COL]

//物理座標X軸反校正表  X-列   用物理座標定位列

const int16 XY_COL[YMAX_1][XMAX2_1]

目 錄

摘要

1 引言

結束語

摘要

       在機器視覺檢測中大視場短焦距攝像機鏡頭一般都存在一定程度的光學畸變,本文以飛思卡爾智慧車大賽為背景,由於攝像頭光軸與地面呈一定夾角,於是其成像存在梯形失真;為了擴大視野,廣角鏡頭越來越為很多隊伍所採用,於是又存在桶形失真。MATLAB中的數字影象是以矩陣形式表示的,這意味著MATLAB強大的矩陣運算能力用於影象處理非常有利,矩陣運算的語法對MATLAB中的數字影象同樣適用。本文繼承了影象幾何校正法座標變換的思想精髓,簡要論述了MATLAB對攝像頭影象畸變失真校正原理和方法。

  關鍵詞: MATLAB 攝像頭影象 失真校正

1、引言

       智慧車利用攝像頭感測器,通過識獲取別路面黑色條帶狀引導線實現自主導航是現階段智慧車較常用的導航方法。由於攝像頭鏡頭為不均勻的透鏡,拍攝到的影象會出一定的光學畸變,廣角鏡頭的失真通常會很嚴重。攝像頭所產生的失真主要是桶形失真[1],如圖一。還有攝像頭在拍攝影象的時候, 最理想的位置是能垂直於拍攝平面, 這樣才能保證影象能按原來的幾何比例重現。然而在智慧車的實際運用中, 受到智慧車車體結構的限制和車體控制需攝像頭有一定預瞄距離的要求, 攝像頭一般與地平面成一定角度安裝。這種角度的存在會造成一定的成像畸變—梯形失真[2], 影象的畸變會產生一系列問題: 垂直線被拍攝成斜線導致斜率計算錯誤, 遠處的彎道被壓縮導致曲率計算錯誤等等。在這種情況下, 直接利用目標引導線在影象中的相對位置制定控制策略, 會造成較大的誤差, 甚至使小車嚴重偏離導航線。針對此問題, 下面將運用MATLAB分別對桶形失真和梯形失真做校正。

圖一:桶形失真                                       圖二:梯形失真

2、影象校正理論

       影象校正是指對失真影象進行的復原性處理。引起影象失真的原因有:成象系統的象差、畸變、頻寬有限等造成的圖象失真;由於成象器件拍攝姿態和掃描非線性引起的圖象幾何失真;由於運動模糊、輻射失真、引入噪聲等造成的影象失真。圖象校正的基本思路是,根據影象失真原因,建立相應的數學模型,從被汙染或畸變的圖象訊號中提取所需要的資訊,沿著使圖象失真的逆過程恢復圖象本來面貌。實際的復原過程是設計一個濾波器,使其能從失真圖象中計算得到真實圖象的估值,使其根據預先規定的誤差準則,最大程度地接近真實圖象。從數字影象處理的觀點來考察畸變校正, 實際上是一個影象恢復的過程, 是對一幅退化了的影象進行恢復。幾何畸變失真主要是表現在影象中畫素點發生位移, 從而使影象中物體扭曲變形。造成這類影象退化的原因是多方面的, 而成像系統的非線性, 例如光學系統畸變像差是其中一個主要的因素。

3、影象桶形校正

       文獻一提出的關於幾何畸變的校正研究已經比較成熟,其研究思路是:任何一種幾何失真都可以用原始影象座標和畸變影象座標之間的關係加以描述,因而只需得到原始影象座標和畸變影象座標,就可以找出它們之間的對應關係,對影象進行座標變換,從而得到校正影象[1]。下面運用這種方法在MATLAB對桶形失真做校正。

%% 鏡頭桶形失真校正(短焦鏡頭)

img_origin1 = imread('2.2.jpg');

img_origin = rgb2gray(img_origin1);

 

k1 = -0.000023; % 形變引數,根據實際情況調整

k2 = -0.0000037;

 

img_size = size( img_origin );

img_undist = zeros( img_size );

img_undist = uint8( img_undist );

 

for l1 = 1:img_size(1)% 垂直方向

y = l1 - img_size(1)/2;

for l2 = 1:img_size(2)% 水平方向

x = l2 - img_size(2)/2;

x1 = round( x * ( 1 + k1 * x * x + k2 * y * y ) ); %文獻一公式

y1 = round( y * ( 1 + k1 * x * x + k2 * y * y ) );

y1 = y1 + img_size(1)/2;

x1 = x1 + img_size(2)/2;

y1 = uint8( y1 );

x1 = uint8( x1 );

img_undist(l1,l2) = img_origin(y1, x1);

end

end

 

figure(1);

subplot(121); imshow(img_origin);title('原圖,60*160');

subplot(122); imshow(img_undist);title('校正圖');

 

imwrite(img_origin,'1.bmp');

imwrite(img_undist,'2.bmp');

執行程式將輸出如下影象:

影象原圖中,上下原來為直線的條狀物由於桶形失真變為了彎曲狀,經過校正後恢復直線條狀物。

4、影象梯形失真

      文獻三提出為實現攝像機畸變引數標定, 提出了一種基於非線性逆透視變換模型的標定新方法. 根據線性視變換模型和畸變模型推匯出非線性逆透視變換模型, 以及逆透視變換引數與畸變引數之間的關係[3]。下面運用這種方法在MATLAB對梯形失真做校正。

%%首先測量四組物理座標xy值,生成M矩陣

x1=-20;

y1=20;

u1=13;

v1=37;

 

x2=20;

y2=20;

u2=126;

v2=37;

 

x3=-30;

y3=40;

u3=8;

v3=22;

 

x4=30;

y4=40;

u4=132;

v4=22;

 

A=[u1,v1,1,0,0,0,-u1*x1,-v1*x1;0,0,0,u1,v1,1,-u1*y1,-v1*y1;u2,v2,1,0,0,0,-u2*x2,-v2*x2;0,0,0,u2,v2,1,-u2*y2,-v2*y2;

u3,v3,1,0,0,0,-u3*x3,-v3*x3;0,0,0,u3,v3,1,-u3*y3,-v3*y3;u4,v4,1,0,0,0,-u4*x4,-v4*x4;0,0,0,u4,v4,1,-u4*y4,-v4*y4];

B=[x1;y1;x2;y2;x3;y3;x4;y4];

M=A\B

M =

1.0477

0.0349

-74.1094

-0.0000

-1.8277

126.8219

-0.0000

0.0530


執行上面這段程式獲得M矩陣,即攝像頭的畸變引數,為下面的逆變換計算引數:

%% 鏡頭失真校正--逆變換

clear,clc

img_origin1 = imread('107_1.BMP'); %讀取影象檔案

img_origin = rgb2gray(img_origin1); %將真彩色影象轉換為灰度影象二維矩陣

 
img_size = size( img_origin ); % 返回矩陣的行數或列數 其中r=size(A,1)該語句返回矩陣A的行數row為垂直方向



m1=1.0477; %上面程式生成的m引數

m2=0.0349;

m3=-74.1094;

m4=0;

m5=-1.8277;

m6=126.8219;

m7=0;

m8=0.0530;

 

u=160; % 水平方向column

v=0; % 行row為垂直方向

x=(m1*u+m2*v+m3)/(m7*u+m8*v+1);% 水平方向column

y=(m4*u+m5*v+m6)/(m7*u+m8*v+1); % 行row為垂直方向

x=uint16(x);

y=uint16(y); %本段為生成新矩陣容納校正後的影象

img_undist = zeros(y ,x ); % zeros(m,n)產生m×n的全0矩陣 所有元素初始化為0

new_size = size(img_undist); % 返回m×n全0矩陣的行數或列數

img_undist = uint8( img_undist );

 

for i = 1:(img_size(1)) % 行row為垂直方向

for j = 1:(img_size(2)) % 水平方向column

u=j; % 水平方向column

v=i; % 垂直方向

x=(m1*u+m2*v+m3)/(m7*u+m8*v+1); % 水平方向column

y=(m4*u+m5*v+m6)/(m7*u+m8*v+1);% 行row為垂直方向

x=int16(x)+new_size(2)/2; %物理座標用負,現修正顯示

y=int16(y);

if(y>0 &&x>0 )

img_undist(y,x)= img_origin(i,j); %對應座標

end

end

end

img_undist=flipud(img_undist); %矩陣以水平軸翻轉

subplot(1,2,1);imshow(img_origin);title('原圖,60*160');

subplot(1,2,2);imshow(img_undist);title('校正圖');	

執行程式將輸出如下影象:

從校正圖可以看出:原圖兩條黑線呈梯形向前方縮排;還有前方越遠影象資訊被壓縮得越嚴重。

5、結束語

       MATLAB是一種基於向量而不是標量的高階程式語言,因而MATLAB從本質上就提供了對影象的支援。從影象的數字化過程知道,數字影象實際上就是一組有序的離散資料,使用MATLAB可以結這些離散資料形成的矩陣進行一次整體概念。用MATLAB數字影象處理技術來實現光學系統的畸變校正, 是畸變像差校正的一種新的嘗試。它非常適用於那些很難用光學像差校正方法來實現其畸變校正的光學系統。通過對它們所成的畸變影象進行校正處理, 不但能夠減小影象的目視失真, 還能夠使影象達到測量的要求, 做為定量分析的基礎。攝像頭失真使其應用受到了很大的限制,本文關於攝像頭失真校正的研究,可以應用於任何一個成像系統失真的校正,,對影象識別、影象配准以及影象拼接等研究有很大的幫助,具有較高的實用價值。

[參考文獻]

[1] 徐海雲 王普 王廣生 攝像頭失真校正的研究

[2] 甄紅濤 齊曉慧 白勇博 智慧車攝像頭影象畸變矯正的研究

[3] 李顥 楊明 基於非線性逆透視變換的攝像機畸變引數標定