柚子快報(bào)激活碼778899分享:智能車圖像處理逆透視教程
柚子快報(bào)激活碼778899分享:智能車圖像處理逆透視教程
去畸變請參考:圖像處理去畸變教程_LoseHu的博客-CSDN博客
去畸變+逆透視請參考:?????????????????????智能車去畸變+逆透視教程_LoseHu的博客-CSDN博客
逆透視:如下
1.簡介
對于初做車的同學(xué),看見攝像頭圖像神奇的側(cè)視角難免會(huì)有些煩躁,我剛開始也是如此,所以在此,想詳細(xì)的分享一下我們的透視變換方案。(實(shí)戰(zhàn)教學(xué))
先上各種效果圖。
優(yōu)點(diǎn):
??????? 使用指針映射透視變換數(shù)組,只需要初始化映射一次,后續(xù)不需要時(shí)間???????
????????通用性強(qiáng),可移植性高
? ? ? ?還可以已知原圖坐標(biāo)情況下求透視后坐標(biāo)
2.攝像頭環(huán)境
??????? 硬件:總鉆風(fēng)攝像頭(由于多車組使用沁恒芯片,修改過硬件適應(yīng)dvp)
??????? 鏡頭:140度鏡頭,畸變小于5%
??????? 攝像頭分辨率:120*188(長*寬)
??????? 透視圖分辨率:100*114(長*寬)
??????? 攝像頭高度:30cm左右
總鉆風(fēng)是很常見的智能車攝像頭,之所以選用140度鏡頭,是因?yàn)槠浣嵌却螅一兟史浅P?,完全不影響圖像處理,可以省去去畸變的煩惱,攝像頭120*188是因?yàn)槠浔壤梢允挂曇白畲蟆?/p>
3.逆透視簡單原理
??????? 眾所周知,對于十字這個(gè)元素,標(biāo)準(zhǔn)賽道(不算路肩、黑膠帶),它是一個(gè)寬度為45cm的標(biāo)準(zhǔn)正方形。但是因?yàn)閿z像頭角度問題,十字的正方形在圖片中是一個(gè)梯形。
那嚒我們所要做的,就是根據(jù)圖片中的這一塊梯形(實(shí)則是正方形),這一個(gè)信息,將圖片進(jìn)行拉伸變換,使之成為標(biāo)準(zhǔn)的俯視圖。
?公式:
?w與w’在二維圖中為1
?已知結(jié)果圖中坐標(biāo),通過上述公式就能在原圖中找到對應(yīng)的坐標(biāo)。
?那么這個(gè)3*3矩陣就是我們需要使用上位機(jī)求取的。
4.通過上位機(jī)求取矩陣
環(huán)境準(zhǔn)備:
? ??????? 拍攝的十字圖像(或正方形圖像),灰度與二值化圖均可,要能完全展示出正方形部分,如:
?圖像中可以顯示出車頭,因?yàn)樵诤罄m(xù)的透視過程中可以通過圖像修改參數(shù)平移去除。
那么,根據(jù)圖中的假正方形,就可以進(jìn)行后續(xù)操作。
上位機(jī)操作:
?結(jié)果圖寬高:得到的透視圖像的寬高。
方形中心距頂部像素:在結(jié)果圖中,正方形的中心,距離圖像最上端多少個(gè)像素行(值越大,圖像越向下平移)。
方形像素邊長:在結(jié)果圖中,正方形的邊長相當(dāng)于多少個(gè)像素(值越大,圖片就會(huì)被放大更多,如果是45,就是一像素對應(yīng)1cm距離)。
四個(gè)XY值:圖中方形四個(gè)頂點(diǎn)的坐標(biāo),通過鼠標(biāo)右鍵在圖中點(diǎn)擊就可以自動(dòng)輸入(點(diǎn)擊順序:左下---右下---左上---右上)。
逆透視上位機(jī)操作
???? 最終矩陣會(huì)復(fù)制到您的剪切板中,如:
{{-10.603578,4.261626,-292.576700},
{0.665623,6.708527,-1508.674551},
{0.000570,0.016935,-2.741442}};
注意事項(xiàng):
??????? 1.圖片經(jīng)過逆透視操作后得到的結(jié)果圖,因?yàn)閷D片進(jìn)行了拉伸,底邊兩個(gè)角落可能會(huì)出現(xiàn)無內(nèi)容部分(如下圖),使用時(shí)應(yīng)當(dāng)避免.可通過修改結(jié)果圖大小,或者增大方形中心距頂部像素來對圖形進(jìn)行平移去除。
?????????2.鼠標(biāo)點(diǎn)擊順序要符合左下---右下---左上---右上。
?????????有些圖片打開失敗,請檢查圖片后綴,有的是jpg格式,后綴卻是bmp。
5.在智能車上使用矩陣:
原理說明:
求得矩陣后,就可根據(jù)矩陣,和結(jié)果圖的坐標(biāo),計(jì)算出結(jié)果圖中的某個(gè)點(diǎn),在原圖中的坐標(biāo)。
但如果每獲取到一幀圖像,都進(jìn)行一次映射,非常耗費(fèi)時(shí)間。所以我們使用指針。
在初始化時(shí)只需要對指針地址進(jìn)行一次映射,以后只需要調(diào)用指針數(shù)組,就可以獲取到透視后的圖。(需要注意的是,和圖像一樣的大的指針數(shù)組可能會(huì)導(dǎo)致您的內(nèi)存溢出,所以建議將透視圖尺寸縮小,即減小RESULT_ROW與RESULT_COL,也可以避免黑邊出現(xiàn))
change_un_Mat[3][3] 是你通過上位機(jī)求取的矩陣,在您的剪切板中。
ImageUsed[0][0]代表圖像左上角的值
PER_IMG??? 為用來透視變換的圖片,如果使用灰度圖,那么ImageUsed就是灰度圖的逆透視圖,
如果使用二值化圖,那么ImageUsed就是二值化的逆透視圖
BlackColor的值為沒有內(nèi)容部分的灰度值。
只需要初始化時(shí)調(diào)用一次ImagePerspective_Init()函數(shù),只需要初始化時(shí)調(diào)用一次?。。。∫淮尉托校。。。。。?!
//
// Created by RUPC on 2022/9/20.
//
#define RESULT_ROW 100//結(jié)果圖行列
#define RESULT_COL 114
#define USED_ROW 120 //用于透視圖的行列
#define USED_COL 188
#define PER_IMG SimBinImage//SimBinImage:用于透視變換的圖像
#define ImageUsed *PerImg_ip//*PerImg_ip定義使用的圖像,ImageUsed為用于巡線和識別的圖像
typedef unsigned char uint8_t; // 無符號 8 bits
uint8_t *PerImg_ip[RESULT_ROW][RESULT_COL];
void ImagePerspective_Init(void) {
static uint8_t BlackColor = 0;
double change_un_Mat[3][3] = { //114w*100h
{ -0.01609759704190238, 0.01932561893613478, -2.040617594981866 }, {
0.0004352209945470896, -0.000367865364438621,
-0.7035606436969671 }, { 1.115951268069474e-005,
0.0001970185393508392, -0.03104642853440032 }, };
for (int i = 0; i < RESULT_COL ;i++) {
for (int j = 0; j < RESULT_ROW ;j++) {
int local_x = (int) ((change_un_Mat[0][0] * i
+ change_un_Mat[0][1] * j + change_un_Mat[0][2])
/ (change_un_Mat[2][0] * i + change_un_Mat[2][1] * j
+ change_un_Mat[2][2]));
int local_y = (int) ((change_un_Mat[1][0] * i
+ change_un_Mat[1][1] * j + change_un_Mat[1][2])
/ (change_un_Mat[2][0] * i + change_un_Mat[2][1] * j
+ change_un_Mat[2][2]));
if (local_x
>= 0&& local_y >= 0 && local_y < USED_ROW && local_x < USED_COL){
PerImg_ip[j][i] = &PER_IMG[local_y][local_x];
}
else {
PerImg_ip[j][i] = &BlackColor; //&PER_IMG[0][0];
}
}
}
}
/*完成攝像頭初始化后,調(diào)用一次ImagePerspective_Init,此后,直接調(diào)用ImageUsed 即為透視結(jié)果*/
屏幕顯示透視變換后的灰度圖DEMO:
int main(void)
{
All_Init();//屏幕、攝像頭、以及其他外設(shè)初始化
ImagePerspective_Init();
while(1)
{
if (mt9v03x_finish_flag_dvp == 1) {
uint8_t show[RESULT_ROW][RESULT_COL];
for(int i=0;i { for(int j=0;j { show[i][j]=ImageUsed[i][j]; } } ips114_show_gray_image(0,0,show[0],RESULT_COL,RESULT_ROW,RESULT_COL,RESULT_ROW,0); mt9v03x_finish_flag_dvp = 0; } } } 若想使用zf庫函數(shù)顯示需要針對指針略作更改,參考如下: (看注釋的sample,用不來就用上面) /** *@Name :ips114_show_gray_image_vec *@Description :ips114_show_gray_image_vec 顯示透視變換指針?biāo)傅膱D像 *@Param : *@Return : *@Sample :ips114_show_gray_image_vec(0,0,PerImg_ip,TRFED_COL,TRFED_ROW,TRFED_COL,TRFED_ROW,0); **/ void ips114_show_gray_image_vec (uint16_t x, uint16_t y, uint8_t *p[][TRFED_COL], uint16_t width, uint16_t height, uint16_t dis_width, uint16_t dis_height, uint8_t threshold) { zf_assert(x < ips114_x_max); zf_assert(y < ips114_y_max); uint32_t i = 0, j = 0; uint16_t color = 0,temp = 0; uint32_t width_index = 0, height_index = 0; ips114_set_region(x, y, x+dis_width-1, y+dis_height-1); // 設(shè)置顯示區(qū)域 for(j=0;j { height_index = j*height/dis_height; for(i=0;i { width_index = i*width/dis_width; temp = *p[height_index][width_index]; // 讀取像素點(diǎn) if(threshold == 0) { color=(0x001f&((temp)>>3))<<11; color=color|(((0x003f)&((temp)>>2))<<5); color=color|(0x001f&((temp)>>3)); ips114_write_16bit_data(color); } else if(temp < threshold) ips114_write_16bit_data(BLACK); else ips114_write_16bit_data(WHITE); } } } 效果顯示:? ?已知原圖坐標(biāo)情況下求透視后坐標(biāo) ? ? ? ? 如果只想對邊線或是某些點(diǎn)進(jìn)行逆透視,在使用同樣矩陣下,可以參考17屆智能車-多車編隊(duì)尋光測距_Wyean的博客-CSDN博客 6.資源文件 ????????其中包含了測試圖包 ????????CSDN:https://download.csdn.net/download/wu58430/86399773 ????????推薦github:https://github.com/wu58430/RUBO-IPM ????????如果只使用用途,下載github中Release即可。 ????????現(xiàn)在已經(jīng)完成了逆透視、去畸變、逆透視+去畸變的操作,除非程序有重大bug,后續(xù)不會(huì)考慮更新。此三種只是圖片處理方法,如此軟件只適用于簡化和降低操作的門檻,以便大家共同進(jìn)步,圖像處理方法無好壞之分,但確實(shí)有精妙與粗糙之別。 版權(quán)聲明: ? ? ? ? 此軟件僅用于競賽、學(xué)習(xí)交流,禁止任何商業(yè)用途,包括有營利性的、商業(yè)的教學(xué)指導(dǎo)活動(dòng)。 7.更新日志 ??????? 2022.8.23????????修復(fù)了不同版本windows兼容問題 ??????? 2022.8.27????????修復(fù)中文路徑、視圖大小異常問題,縮小程序體積 ??????? 2022.9.23????????增加了彩色圖像顯示,輸出格式改為數(shù)組 ??????? 2022.10.7????????代碼遷移至QT6.3.1環(huán)境,加入去畸變,加入保存圖片功能 ??????? 2022.10.29????????融合兩種方法,修復(fù)保存圖像色彩錯(cuò)誤問題 ??????? 2023.1.12??????? 修復(fù)去畸變+逆透視下位機(jī)代碼中未考慮的可能 柚子快報(bào)激活碼778899分享:智能車圖像處理逆透視教程 參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。