找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 7400|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

桶形校正+逆投影變換GUIv1 MATLAB程序分享

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
桶形變換程序分享,基于MATLAB


(1)先看“逆透視在智能車中使用”
(2)再看“上位機(jī)使用步驟”


逆透視在智能車中的使用
透視矯正上位機(jī)
對智能車圖像進(jìn)行的透視校正,能夠使得攝像頭的固定與程序的耦合相離。
當(dāng)攝像頭受到損壞或其他原因需要重新安裝時(shí),可通過透視校正的重新標(biāo)定,基本不需要再調(diào)試就可以恢復(fù)到之前的狀態(tài)。
透視矯正的重點(diǎn)在于要通過矩陣計(jì)算獲得一組參數(shù),將參數(shù)放入程序中使用。
我們使用 MATLAB 開發(fā)了用于生成參數(shù)的軟件,并且兼具取點(diǎn),圖像效果測試,單點(diǎn)測試的功能。
透視矯正的方法是制作一塊矯正板,如下圖所示:

將車放置在上面之后使用圖像采集上位機(jī)采集并保存圖像,然后打開透視校正軟件。


上位機(jī)使用步驟:

1.打開 GUI4 文件夾運(yùn)行 inverse_perspective_mapping_demo.m 文件
2.選擇原始圖像(注意選擇圖像格式,必須把圖像保存在目標(biāo)文件中)
3.調(diào)節(jié) k1,k2 兩個(gè)參數(shù)來校正桶形失真,調(diào)節(jié)好后記下兩個(gè)參數(shù)
4. (1)如需進(jìn)行圖像抽取,運(yùn)行 Barrel_table.m 文件帶入 k1,k2 兩個(gè)參數(shù)運(yùn)行,再運(yùn)行 haha.m
文件生成 U(行)、I(列)變量,即校正并抽取后的圖像校正表,可在文檔編輯器中空格替
換成“,”以便寫入程序,注意最后一列需要手動(dòng)添加。
如不需進(jìn)行圖像抽取,直接在上位機(jī)點(diǎn)擊生成桶形失真校正表即可。保存在 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 數(shù)組中保存的是原始圖像 img_barrel[CAMERA_H][CAMERA_W]是校正后圖
像)
到這里桶形失真就做完了。
5.將校正后的圖像通過藍(lán)牙發(fā)送到電腦保存,用上位機(jī)打開。
6.k1 調(diào)到 0,k2 調(diào)到 3.3881e-21 調(diào)到,點(diǎn)擊“選取標(biāo)定點(diǎn)”按提示選取會(huì)自動(dòng)生成圖像坐
標(biāo),然后再自己輸入實(shí)際坐標(biāo)(左為列 、右為行、自行確定實(shí)際坐標(biāo)原點(diǎn)位置),點(diǎn)擊“生
成參數(shù)”即可生成
逆透視校正參數(shù) rot = [ 8.3026, 2.8477e-12, -668.3553; -2.9995e-13, -12.6121, 884.3799; -3.6189e-14, 0.08971, 1 ]。
可進(jìn)行圖像測試和單點(diǎn)測試
7.對照 rot 依次聲明六個(gè)逆透視參數(shù)宏定義
#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.兩個(gè)坐標(biāo)變換函數(shù)
typedef struct
{
double x;
double y;
} Site_xy; //定義浮點(diǎn)型結(jié)構(gòu)體
typedef struct
{
int16 x;
int16 y;
} Site_xy1; //定義整型結(jié)構(gòu)體
圖像轉(zhuǎn)實(shí)際函數(shù)
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;
}
/******************************************************************************
*****************************************************/
實(shí)際轉(zhuǎn)圖像函數(shù)
Site_xy1 get_invinv_img(double xxx,double yyy) //反逆透視(xxx 為實(shí)際行,yyy 為列)
{
Site_xy1 temp;
double uSrcImg,vSrcImg;//反逆透視坐標(biāo)
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;
}

  1. % 鏡頭桶形失真校正(短焦鏡頭)
  2. clc,clear;
  3. img_origin1 = imread('555.bmp');
  4. img_origin = rgb2gray(img_origin1);

  5. k1 =-8.5e-06; % 形變參數(shù),根據(jù)實(shí)際情況調(diào)整
  6. k2 =-8.5e-06;

  7. img_size = size( img_origin );
  8. img_undist = zeros( img_size );
  9. img_undist = uint8( img_undist );
  10. C=zeros(img_size(1),img_size(2));
  11. D=zeros(img_size(1),img_size(2));
  12. for l1 = 1:img_size(1) % 垂直方向
  13. y = l1 - img_size(1)/2;
  14. for l2 = 1:img_size(2) % 水平方向
  15. x = l2 - img_size(2)/2;
  16. x1 = round( x * ( 1 + k1 * x * x + k2 * y * y ) ); %文獻(xiàn)一公式
  17. y1 = round( y * ( 1 + k1 * x * x + k2 * y * y ) );
  18. y1 = y1 + img_size(1)/2;
  19. x1 = x1 + img_size(2)/2;
  20. y1 = uint8( y1 );
  21. x1 = uint8( x1 );
  22. if   y1 > 0 ||  y1 <=img_size(1) || x1 > 0 || x1 <=img_size(2)
  23.      C(l1,l2)=y1-1;
  24.      D(l1,l2)=x1-1;
  25. end
  26. img_undist(l1,l2) = img_origin(y1, x1);
  27. end
  28. end

  29. figure(1);
  30. subplot(121); imshow(img_origin);title('原圖');
  31. subplot(122); imshow(img_undist);title('校正圖');

  32. imwrite(img_origin,'1.bmp');
  33. imwrite(img_undist,'2.bmp');
復(fù)制代碼

全部資料51hei下載地址:
桶形校正 逆投影變換GUIv1.zip (2.53 MB, 下載次數(shù): 95)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:389026 發(fā)表于 2018-8-22 20:35 | 只看該作者
黑幣不夠,對于初學(xué)者有很大幫助,可惜下不了
回復(fù)

使用道具 舉報(bào)

板凳
ID:398021 發(fā)表于 2018-11-23 16:59 | 只看該作者
請問這個(gè)上位機(jī)軟件用的圖片格式是什么啊
回復(fù)

使用道具 舉報(bào)

地板
ID:197571 發(fā)表于 2019-6-5 20:21 | 只看該作者
樓主,請問一下這個(gè)軟件怎么做逆透視變換呢
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表