桶形變換程序分享,基于MATLAB
(1)先看“逆透視在智能車中使用”
(2)再看“上位機使用步驟”
逆透視在智能車中的使用
透視矯正上位機
對智能車圖像進行的透視校正,能夠使得攝像頭的固定與程序的耦合相離。
當攝像頭受到損壞或其他原因需要重新安裝時,可通過透視校正的重新標定,基本不需要再調試就可以恢復到之前的狀態。
透視矯正的重點在于要通過矩陣計算獲得一組參數,將參數放入程序中使用。
我們使用 MATLAB 開發了用于生成參數的軟件,并且兼具取點,圖像效果測試,單點測試的功能。
透視矯正的方法是制作一塊矯正板,如下圖所示:
將車放置在上面之后使用圖像采集上位機采集并保存圖像,然后打開透視校正軟件。
上位機使用步驟:
1.打開 GUI4 文件夾運行 inverse_perspective_mapping_demo.m 文件
2.選擇原始圖像(注意選擇圖像格式,必須把圖像保存在目標文件中)
3.調節 k1,k2 兩個參數來校正桶形失真,調節好后記下兩個參數
4. (1)如需進行圖像抽取,運行 Barrel_table.m 文件帶入 k1,k2 兩個參數運行,再運行 haha.m
文件生成 U(行)、I(列)變量,即校正并抽取后的圖像校正表,可在文檔編輯器中空格替
換成“,”以便寫入程序,注意最后一列需要手動添加。
如不需進行圖像抽取,直接在上位機點擊生成桶形失真校正表即可。保存在 barrelCOL.txt(行)
和 barrelROW.txt(列)
(2)聲明變量
const uint8 img_barrel_row[CAMERA_H][CAMERA_W]={桶形失真行校正表}
const uint8 img_barrel_col[CAMERA_H][CAMERA_W]={桶形失真列校正表}
uint8 img_barrel[CAMERA_H][CAMERA_W]; //桶形失真矯正后圖像
(3)校正后圖像
for(uint8 ii=0;ii<CAMERA_H;ii++)
{
for(uint8 jj=0;jj<CAMERA_W;jj++) {
img_barrel[ii][jj]=img[img_barrel_row[ii][jj]][img_barrel_col[ii][jj]];
}
}
(注:Img 數組中保存的是原始圖像 img_barrel[CAMERA_H][CAMERA_W]是校正后圖
像)
到這里桶形失真就做完了。
5.將校正后的圖像通過藍牙發送到電腦保存,用上位機打開。
6.k1 調到 0,k2 調到 3.3881e-21 調到,點擊“選取標定點”按提示選取會自動生成圖像坐
標,然后再自己輸入實際坐標(左為列 、右為行、自行確定實際坐標原點位置),點擊“生
成參數”即可生成
逆透視校正參數 rot = [ 8.3026, 2.8477e-12, -668.3553; -2.9995e-13, -12.6121, 884.3799; -3.6189e-14, 0.08971, 1 ]。
可進行圖像測試和單點測試
7.對照 rot 依次聲明六個逆透視參數宏定義
#define INV_A 8.3026
#define INV_B 0
#define INV_C -668.3553
#define INV_D 0
#define INV_E -12.6121
#define INV_F 884.3799
#define INV_G 0
#define INV_H 0.08971
8.兩個坐標變換函數
typedef struct
{
double x;
double y;
} Site_xy; //定義浮點型結構體
typedef struct
{
int16 x;
int16 y;
} Site_xy1; //定義整型結構體
圖像轉實際函數
Site_xy get_inv_img(int16 xxx ,int16 yyy) //逆透視(xxx 為圖像行,yyy 為列)
{
Site_xy temp;
xxx++;
yyy++;
temp.y = (INV_A*yyy+INV_B*xxx+INV_C)/(INV_G*yyy+INV_H*xxx+1);
temp.x = (INV_D*yyy+INV_E*xxx+INV_F)/(INV_G*yyy+INV_H*xxx+1);
return temp;
}
/******************************************************************************
*****************************************************/
實際轉圖像函數
Site_xy1 get_invinv_img(double xxx,double yyy) //反逆透視(xxx 為實際行,yyy 為列)
{
Site_xy1 temp;
double uSrcImg,vSrcImg;//反逆透視坐標
uSrcImg =(INV_B*INV_F - INV_C*INV_E + INV_E*yyy - INV_B*xxx - INV_F*INV_H*yyy +
INV_C*INV_H*xxx)/(INV_A*INV_E - INV_B*INV_D + INV_D*INV_H*yyy - INV_E*INV_G*yyy -
INV_A*INV_H*xxx + INV_B*INV_G*xxx);
vSrcImg =-(INV_A*INV_F - INV_C*INV_D + INV_D*yyy - INV_A*xxx - INV_F*INV_G*yyy +
INV_C*INV_G*xxx)/(INV_A*INV_E - INV_B*INV_D + INV_D*INV_H*yyy - INV_E*INV_G*yyy -
INV_A*INV_H*xxx + INV_B*INV_G*xxx);
temp.x=round(vSrcImg-1);
temp.y=round(uSrcImg-1);
return temp;
}
- % 鏡頭桶形失真校正(短焦鏡頭)
- clc,clear;
- img_origin1 = imread('555.bmp');
- img_origin = rgb2gray(img_origin1);
-
- k1 =-8.5e-06; % 形變參數,根據實際情況調整
- k2 =-8.5e-06;
-
- img_size = size( img_origin );
- img_undist = zeros( img_size );
- img_undist = uint8( img_undist );
- C=zeros(img_size(1),img_size(2));
- D=zeros(img_size(1),img_size(2));
- 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 );
- if y1 > 0 || y1 <=img_size(1) || x1 > 0 || x1 <=img_size(2)
- C(l1,l2)=y1-1;
- D(l1,l2)=x1-1;
- end
- img_undist(l1,l2) = img_origin(y1, x1);
- end
- end
-
- figure(1);
- subplot(121); imshow(img_origin);title('原圖');
- subplot(122); imshow(img_undist);title('校正圖');
-
- imwrite(img_origin,'1.bmp');
- imwrite(img_undist,'2.bmp');
復制代碼
全部資料51hei下載地址:
桶形校正 逆投影變換GUIv1.zip
(2.53 MB, 下載次數: 95)
2018-8-12 14:01 上傳
點擊文件名下載附件
|