一.概覽
本人雖然是電子信息技術(shù)專業(yè)出身,在畢業(yè)后從事的是偏軟件的工作,大多數(shù)是PC軟件的開發(fā),但一直以來,閑暇時間會利用STM32做些小的作品。對于RT-Thread這國內(nèi)的物聯(lián)網(wǎng)操作系統(tǒng),其實早有耳聞,期間也參加過深圳的一次RT-Thread線下交流活動,所以對于RT-Thread是有所了解而未實際應(yīng)用的程度。
借著此次RT-Thread大賽的機(jī)會,我想將PC的一些圖像處理和圖像識別算法放到art-pi試跑一下看看效果如何,所以本次參賽將會使用art-pi獲取OV7670的圖像來做像處理和圖像識別。
二.開發(fā)環(huán)境
硬件:PC、ART-PI、OV7670、RGB_LCD
RT-Thread版本:rt-thread4 .0.3,art-pi adk 1.1.0
開發(fā)工具及版本:立創(chuàng)EDA,RT-Studio,SecureCRT
三.RT-Thread使用情況概述
線程:創(chuàng)建圖像處理線程用于通過DCMI獲取OV7670的圖像,圖像處理后完顯示在LCD上
信號量:用于DCMI圖像獲取,當(dāng)捕捉完一幀圖像后,釋放信號量給圖像處理線程。
驅(qū)動:使用了drv_dcmi驅(qū)動并參考drv_ov2640移植drv_ov7670驅(qū)動
四.實現(xiàn)功能展示
通過攝像頭采集圖像進(jìn)行圖像識別,然后將結(jié)果顯示在LCD屏幕上。
五.硬件框架
本次的硬件核心由ART-PI、OV7670、LCD三部分組成:
ART-PI:stm32H750作為控制核心部分,采集圖像源數(shù)據(jù)、處理圖像源生成處理結(jié)果、將處理結(jié)果送到LCD顯示
OV7670:作為圖像源,提供320*240的RGB565圖像
LCD:實時顯示圖像源圖像和顯示處理結(jié)果
六.軟件流程圖
1. 硬件初始化:時鐘、I2C、DCMI、SDRAM、LTDC
2. 進(jìn)入圖像處理線程,啟動拍照并等待拍照完成信號量
3. 完成拍照釋放拍照完成信號量
4. 得到圖像后,進(jìn)行圖像處理與圖像識別
5. 將圖像識別結(jié)果在LCD上顯示
6. 回到步驟2
七.圖像識別功能介紹
通過DCMI驅(qū)動獲取OV7670的分辨率為320*240的RGB565原始圖像。RGB565每個像素使用用下圖的方式存儲,每個像素占用2個字節(jié)。所以每幀320*240的圖像所需內(nèi)存為320*240*2=153600字節(jié)。
實際上,我們在這次項目中并不需要使用到彩色特征,所以先將RGB565轉(zhuǎn)換為灰色度?;叶葓D其實就是每個像素占用一字節(jié),用0-255值來形容一個像素的灰度值。因此320*240所占用的內(nèi)存為76800字節(jié)。
RGB565轉(zhuǎn)灰度圖公式如下: Gray = R*0.299 + G*0.587 + B*0.114
提取的灰度圖后,我們還需要再進(jìn)行一次二值化處理,因此設(shè)定一個閾值,當(dāng)灰色像素大于這個閾值我們將它改為255,低于這個值變成0。這樣就得到一幀只有0和225值的圖像。
得到二值化圖像后,我們便可以尋找要識別物體了。在此使用九宮格的方式提取連通分量,原理其實很簡單,就是在九宮格里尋找連在一起的像素,如果能找到便將該像素便將該像素的坐標(biāo)(位于X行,y列)寫入到鏈表里。如此循環(huán),直到找完所有像素。
完成連通分量的提取后便是特征提取了,我們還是采用九宮格分割法,將取得的圖像平均分割為9個區(qū)域,再計算9個區(qū)域中值為255像素的個數(shù)。通過這一步算法,我們得到了9組特征數(shù)據(jù)。
本次用了兩種特征提取方式:
1. 通過水平與垂直方向的穿越數(shù)找出部分?jǐn)?shù)字
以數(shù)字0和7為例,在1/2寬度處,0和7穩(wěn)定的得到垂直穿越數(shù)是2.而在1/2高度,0的水平穿越數(shù)是2,7的水平穿越數(shù)是1.
2. 在圖像的水平和垂直的中間切分成四塊,根據(jù)四個部分不同像素比例找出其他數(shù)字。以2和3為例 ,在右下角部分,3的每一行都會有像素點,而2會缺幾行。因此2的像素更少從而區(qū)分2和3。
最終檢測效果如下圖:
八.比賽感悟
雖然標(biāo)題是比賽感悟,實際上比賽并不是我的目的。RT-Thread我知道它更久了,但是一直沒有去更進(jìn)一步使用RT-Thread。這次比賽讓我深入了解了RT-Thread的生態(tài)系統(tǒng),給我的感覺真的太驚喜了。RT-Thread平臺擁有豐富的組件,完善的各種外設(shè)驅(qū)動,通過官方的RT-Studio基本上做到入手即用了。
當(dāng)時拿到ART-PI,通過RT-Thread SETTING進(jìn)行勾選,再使用CubeMX選擇外設(shè),生成引腳初始化代碼后。我本次項目的軟件基本平臺已經(jīng)完成了,我只需要專注于我的應(yīng)用層開發(fā)便可以了,這真的是太便利了。
通過本次比賽,讓我對RT-Thread獲得相當(dāng)大的好感,我想未來硬件項目當(dāng)中,我會毫不猶豫的選擇RT-Thread代替其他實時操作系統(tǒng)。