最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

智能車(chē)競(jìng)賽 攝像頭 簡(jiǎn)易攝像頭搜線(xiàn)算法開(kāi)源

2022-08-16 20:00 作者:奇異の芒果  | 我要投稿


各位參加智能車(chē)競(jìng)賽的小伙伴們好呀!


我是一名參加過(guò)16屆智能車(chē)競(jìng)賽的過(guò)時(shí)選手,目前已經(jīng)結(jié)束智能車(chē)競(jìng)賽生涯了,不過(guò)還是沒(méi)有降低對(duì)智能車(chē)的關(guān)注,去年卓大大發(fā)布17屆智能車(chē)競(jìng)賽規(guī)則與16屆相比可謂是變化頗大,在規(guī)則剛發(fā)布的那晚上我都快壓不住自己躁動(dòng)的心,恨不得再選個(gè)組別沖一回,可惜沒(méi)法繼續(xù)參賽,不過(guò)看到學(xué)校的師弟師妹們的調(diào)車(chē)成果,一股屬于我們實(shí)驗(yàn)室的自豪就油然而生了,哈哈。


最近挺多學(xué)弟學(xué)妹們?cè)趩?wèn)一些關(guān)于攝像頭巡線(xiàn)的問(wèn)題,而我早在去年其實(shí)就已經(jīng)做過(guò)了一個(gè)攝像頭簡(jiǎn)易巡線(xiàn)思路和程序,卻一直沒(méi)來(lái)得及去整理,那就正好趁這次機(jī)會(huì),把自己之前寫(xiě)的簡(jiǎn)易搜線(xiàn)程序梳理一下,然后開(kāi)源出來(lái)讓大佬們指點(diǎn)一下,同時(shí)也希望能讓更多剛接觸攝像頭的車(chē)友有一個(gè)關(guān)于搜線(xiàn)的大體思路,而不是盲人摸象般的去對(duì)抗強(qiáng)校傳承。


分享搜線(xiàn)思路之前,先給各位車(chē)友說(shuō)一下我的硬件配置,以及為什么要分享簡(jiǎn)易搜線(xiàn)的方法。


攝像頭方面使用的是逐飛的總鉆風(fēng)攝像頭(灰度),配合逐飛的攝像頭底層驅(qū)動(dòng)函數(shù),就倆字兒——好使;主控用的是CH32V103R8T6,之前參賽允許使用的單片機(jī)就這一款,但是搜線(xiàn)的算法是可以在所有單片機(jī)上面通用的;主板是使用的逐飛出的CH32V103R8T6雙核學(xué)習(xí)板。以上就是主要的硬件,基本上算是全套逐飛了,不過(guò)用起來(lái)也確實(shí)舒服。


軟件部分主要是兩個(gè)點(diǎn),第一個(gè)是用的MounRivers這個(gè)IDE編寫(xiě)的程序,這個(gè)軟件用起來(lái)還是挺容易上手的,就是BUG有點(diǎn)多,正常使用還是影響不大;第二個(gè)就是CH32V103的超小RAM和72M主頻了,估計(jì)不少16屆全向組的車(chē)友都被這個(gè)芯片折磨過(guò),RAM動(dòng)不動(dòng)就寫(xiě)爆了,主頻還低。而這個(gè)也是我分享簡(jiǎn)易搜線(xiàn)方法的主要原因,103實(shí)在是跑不動(dòng)稍微復(fù)雜一點(diǎn)的算法。

OK,前面的廢話(huà)說(shuō)完了,下面進(jìn)入主題。


簡(jiǎn)易搜線(xiàn)的方法主要使用通過(guò)對(duì)比度判斷邊界的方式,之前我也使用過(guò)二值化的方式去處理圖像,但是因?yàn)?03本身主頻就比較低,二值化之后再顯示到屏幕直接就是看PPT,更別提后續(xù)的處理了(我這里說(shuō)的二值化是直接固定閾值,沒(méi)有計(jì)算閾值這一步),因此用了對(duì)比度的方式來(lái)進(jìn)行邊界搜索。


所謂的對(duì)比度算法就是通過(guò)判斷兩個(gè)點(diǎn)之間的差比和之后得到的對(duì)比度是否超過(guò)設(shè)置的對(duì)比度閾值。當(dāng)對(duì)比度閾值合適的時(shí)候,如果兩點(diǎn)的對(duì)比度超過(guò)了閾值則說(shuō)明此處是明顯的黑白交界點(diǎn),而我們的賽道和邊界在灰度圖像上正好是黑白交界的地方,因此即可直接得到賽道邊界。


下面我舉個(gè)例子,簡(jiǎn)單的說(shuō)一下:


1:點(diǎn)1的值為80,點(diǎn)2的值為70。通過(guò)差比和計(jì)算:(點(diǎn)1-點(diǎn)2)/(點(diǎn)1+點(diǎn)2),得到的值約為0.067,得到的是一個(gè)浮點(diǎn)數(shù),而浮點(diǎn)數(shù)需要使用float類(lèi)型存儲(chǔ),但是CH32V103R8T6只有20K的RAM,所以這里我們直接將其乘以200,轉(zhuǎn)為uint8類(lèi)型,從而將占用的空間降低四倍,最后得到的對(duì)比度就是13。


2:點(diǎn)1的值為80,點(diǎn)2的值為50。通過(guò)差比和計(jì)算:(點(diǎn)1-點(diǎn)2)*200/(點(diǎn)1+點(diǎn)2),得到的對(duì)比度為46。


可以很明顯的看出:當(dāng)兩點(diǎn)的值差距逐漸變大時(shí),對(duì)比度也會(huì)有非常大的變化。我們基于這個(gè)即可寫(xiě)出一個(gè)簡(jiǎn)單的對(duì)比度搜線(xiàn)程序。


這個(gè)時(shí)候可能有些同學(xué)比較疑惑,上面的例子我直接把兩點(diǎn)做差也能得到不一樣的差值從而判斷是不是黑白交接點(diǎn)啊,確實(shí),這樣也能判斷出來(lái),但是這樣的局限性非常大,大家可以看看下面的例子:


1:點(diǎn)1的值為80,點(diǎn)2的值為70。通過(guò)差比和計(jì)算:(點(diǎn)1-點(diǎn)2)*200/(點(diǎn)1+點(diǎn)2),得到對(duì)比度13。

2:點(diǎn)1的值為800,點(diǎn)2的值為700。通過(guò)差比和計(jì)算:(點(diǎn)1-點(diǎn)2)*200/(點(diǎn)1+點(diǎn)2),得到對(duì)比度還是13。

3:點(diǎn)1的值為80,點(diǎn)2的值為70。通過(guò)直接做差,得到差值為10。

4:點(diǎn)1的值為800,點(diǎn)2的值為700。通過(guò)直接做差,得到差值為100。


看完了這個(gè)簡(jiǎn)單的舉例,相信各位也都知道為什么要采用差比和計(jì)算的方式了吧,不過(guò)攝像頭采集的像素點(diǎn)最大只有256,上面的例子也只是想突出一下差比和計(jì)算的優(yōu)點(diǎn)。


接下來(lái)就是程序源碼部分了。


先說(shuō)一下其中宏定義及變量的含義以及作用。


宏定義部分:

Search_Image_W:圖像寬度,一般直接定義為總鉆風(fēng)底層的圖像寬度。

Search_Image_H:圖像高度,一般直接定義為總鉆風(fēng)底層的圖像高度。

BLACKPOINT:黑點(diǎn)值,低于此值的直接認(rèn)為是黑點(diǎn)。

WHITEMAXMUL:白點(diǎn)最大值,通過(guò)動(dòng)態(tài)參考點(diǎn)放大得到。

WHITEMAXMUL:白點(diǎn)最小值,通過(guò)動(dòng)態(tài)參考點(diǎn)縮小得到。

REFRENCEROW:計(jì)算參考點(diǎn)時(shí)統(tǒng)計(jì)的行數(shù)。

SEARCHRANGE:邊緣搜線(xiàn)的半徑,通過(guò)規(guī)劃搜線(xiàn)范圍的方式增加搜線(xiàn)速度。

STOPROW:搜線(xiàn)停止行,也可理解為搜線(xiàn)距離。

CONTRASTOFFSET:對(duì)比點(diǎn)的偏移量(用于求對(duì)比度的兩個(gè)點(diǎn)如果用相鄰的兩個(gè)點(diǎn)顯然變化程度不夠,所以?xún)蓚€(gè)點(diǎn)之間一般會(huì)間隔一小段距離,我將其稱(chēng)為對(duì)比點(diǎn)的偏移量)。


變量部分:

Reference_Point:動(dòng)態(tài)參考點(diǎn),通過(guò)求圖像最近幾行的像素點(diǎn)的均值得到,因此每幅圖像都有自己的動(dòng)態(tài)參考點(diǎn),然后將其放大或者縮小之后得到白點(diǎn)的最大值和最小值,通過(guò)這個(gè)來(lái)對(duì)抗圖像中來(lái)自光線(xiàn)不均勻的干擾。

White_Max_Point:動(dòng)態(tài)白點(diǎn)最大值,超過(guò)白點(diǎn)最大值的點(diǎn)不就行邊界判斷。

White_Min_Point:動(dòng)態(tài)白點(diǎn)最小值,搜索邊界時(shí),低于白點(diǎn)最小值的直接認(rèn)為是黑點(diǎn)。

Reference_Col:動(dòng)態(tài)搜線(xiàn)參考列,保存圖像能看到的最遠(yuǎn)的一列來(lái)作為搜線(xiàn)參考列,左右邊界線(xiàn)的搜索則是從此列開(kāi)始。

Reference_Contrast_Ratio:參考對(duì)比度,大于參考對(duì)比度則認(rèn)為是邊界。

Left_Edge_Line[Search_Image_H]:保存左邊界。

Left_Edge_Line[Search_Image_H]:保存右邊界。

Remote_Distance[Search_Image_W]:保存白點(diǎn)遠(yuǎn)端距離(參考列通過(guò)求白點(diǎn)遠(yuǎn)端距離的最小值得到最遠(yuǎn)列)。


乍一看這宏定義和變量還挺多,不是說(shuō)好的簡(jiǎn)易搜線(xiàn)嗎?怎么上來(lái)就是一大堆?哈哈,這個(gè)確實(shí)是簡(jiǎn)易搜線(xiàn),使用103都能穩(wěn)定處理達(dá)到50幀,但雖是簡(jiǎn)易搜線(xiàn),我們也不能只讓它簡(jiǎn)單搜個(gè)線(xiàn)呀,去年參加過(guò)西部賽的車(chē)友們應(yīng)該對(duì)光線(xiàn)印象比較深刻,側(cè)邊的賽道明顯要比靠中間的賽道更暗一點(diǎn),當(dāng)然我這里沒(méi)有吐槽舉辦方的意思,只是舉個(gè)例,同時(shí)這也是我后面重新寫(xiě)了這個(gè)抗光線(xiàn)干擾較強(qiáng)的簡(jiǎn)易搜線(xiàn)算法的主要原因。


下面看看具體的代碼:

參考點(diǎn)獲取

這部分主要是為了先獲取到本幅圖像的一些基本參數(shù),其中包括了一個(gè)近端的參考點(diǎn)以及白點(diǎn)(賽道)的最大最小值,類(lèi)似于把二值化的閾值換成了一個(gè)區(qū)間,小于區(qū)間范圍的點(diǎn)通通認(rèn)為是黑點(diǎn),大于區(qū)間范圍的點(diǎn)通通認(rèn)為是白點(diǎn)。

搜索圖像參考列

我個(gè)人認(rèn)為搜索圖像參考列才是本次分享的靈魂所在。

當(dāng)小車(chē)擺在直道上時(shí),觀察原始灰度圖像,按照對(duì)比度搜線(xiàn)的方法,大家可能都可以想到從圖像中間往兩邊搜線(xiàn),但是如果是彎道或者各種特殊元素,直接從中間搜線(xiàn)就有些不太夠用了。因此,我們?cè)谒阉鬟吔缰?,先一步求得每一列的白點(diǎn)距離,也可以理解為圖像上每列賽道的長(zhǎng)度,然后冒泡求的最遠(yuǎn)的一列作為參考列。

通過(guò)參考列往兩邊搜索邊界則可以獲得最完整的賽道邊界。

當(dāng)然,如果是特殊元素,那么還可以主動(dòng)更改參考列來(lái)讓小車(chē)往需要的地方搜線(xiàn)。

搜索賽道邊界

搜索賽道邊界可以說(shuō)是最冗雜的部分了,因?yàn)?03的主頻實(shí)在太低,所以增加了較多的判斷來(lái)提高搜索邊界的效率,各位可以就著注釋來(lái)看看各個(gè)判斷的主要作用,核心理念就是根據(jù)參考列往兩邊搜索邊界,搜到邊界之后則就行小范圍搜索(提高搜索效率,不用遍歷整行),如果搜索到邊界則保存,如果沒(méi)搜索到則從參考列重新搜索。

最后就是上面用到的兩個(gè)子函數(shù),用的最頻繁的一個(gè)就是限幅函數(shù),防止數(shù)據(jù)溢出導(dǎo)致單片機(jī)死機(jī),另外一個(gè)則是冒泡求值的函數(shù),用來(lái)求數(shù)組的最大最小值。

雙邊限幅函數(shù)
求最大最小值函數(shù)

代碼的源文件我放在了這個(gè)鏈接:https://gitee.com/seekfree_pudding/pudding_code,歡迎各位有興趣的大佬研究討論,也希望大家多多分享一些有意思的算法。


智能車(chē)競(jìng)賽 攝像頭 簡(jiǎn)易攝像頭搜線(xiàn)算法開(kāi)源的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
资兴市| 连平县| 囊谦县| 巴中市| 象州县| 崇信县| 昆明市| 绵阳市| 海林市| 封丘县| 霞浦县| 永济市| 商丘市| 汽车| 三亚市| 承德市| 上虞市| 福泉市| 新蔡县| 横山县| 景宁| 鄂尔多斯市| 红原县| 武山县| 平武县| 农安县| 沧州市| 宜兴市| 信丰县| 灵寿县| 中牟县| 都匀市| 柘荣县| 墨竹工卡县| 昌图县| 长子县| 琼结县| 偃师市| 五寨县| 特克斯县| 大城县|