本文來(lái)源電子發(fā)燒友社區(qū),作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2290503_1_1.html
根據(jù)最近官方MaixPy3和M2 Dock的知識(shí),參考官方文檔和樣例,在官方大牛的支持下,學(xué)習(xí)了基礎(chǔ)的魔方色塊的尋找功能,并以此分享給大家。
目錄:
- 基礎(chǔ)知識(shí)普及:圖傳與Lab顏色系統(tǒng)
- M2 Dock圖傳功能開啟
- 圖傳功能使用
- Lab閾值獲取
- 魔方色塊尋找
一、基礎(chǔ)知識(shí)普及
-
圖傳:
圖傳的概念,在無(wú)人機(jī)中非常常見,簡(jiǎn)單來(lái)講,就是把攝像頭拍攝的實(shí)時(shí)視頻,又快又好的傳遞到終端設(shè)備上呈現(xiàn),既要速度,不能卡,卡了沒意思,也要質(zhì)量,清晰度不能低,低了沒得玩。而傳輸速度快,質(zhì)量高,又可能占用較多的設(shè)備資源,以及需要較大的帶寬,所以設(shè)計(jì)一個(gè)上好的圖傳方案和系統(tǒng),是很多該行業(yè)廠家的重大追求目標(biāo)之一。 -
Lab:
Lab是一種用數(shù)字化的方法來(lái)描述人的視覺感應(yīng)的顏色系統(tǒng)。它是一種設(shè)備無(wú)關(guān)的、基于生理特征的顏色系統(tǒng)。在機(jī)器視覺中,Lab的概念會(huì)經(jīng)常提及。
可以用一張圖,來(lái)詳細(xì)描述Lab顏色空間:
上述圖,是從人的視覺感應(yīng)角度來(lái)看的。
首先是L:表示亮度,從純黑到純白,取值可以從 0 -> 100
然后是a:表示從紅色到綠色的范圍,取值可以從 -128 -> 127
最后是b:表示從藍(lán)色到黃色的范圍,取值可以從 -128 -> 127
通常,Lab會(huì)以范圍的形式來(lái)表示,也就是Lab閾值,因?yàn)橐驗(yàn)楝F(xiàn)場(chǎng)環(huán)境的不同,我們看到的顏色,不可能是完完全全的理論純色,所以給出一定的容錯(cuò)范圍;
例如:[(0, 100, 21, 127, -128, -9)],分別表示:L-min、L-max、a-min、a-max、b-min、b-max,機(jī)器視覺就根據(jù)這個(gè)范圍,來(lái)進(jìn)行顏色判斷。
二、M2 Dock圖傳功能開啟
了解了以上的基礎(chǔ)概念后,我們就可以進(jìn)入正題,在M2 Dock上,具體使用相關(guān)的功能。
得益于MaixPy3的強(qiáng)大,不用10行代碼,就能開啟M2 Dock的圖傳功能,以下為實(shí)際的代碼:
from maix import camera, mjpg, utils, display
queue = mjpg.Queue(maxsize=8)
mjpg.MjpgServerThread("0.0.0.0", 18811, mjpg.BytesImageHandlerFactory(q=queue)).start()
while True:
img = camera.capture()
jpg = utils.rgb2jpg(img.convert("RGB").tobytes(), img.width, img.height)
queue.put(mjpg.BytesImage(jpg))
display.show(img)
要運(yùn)行上述代碼,方法很多:
-
在
MaixPy3的網(wǎng)頁(yè)編輯界面中,運(yùn)行上述代碼:
- 可以用adb shell或者ssh連接到M2 Dock后,運(yùn)行python后,再輸入代碼運(yùn)行
-
也可以用adb shell或者ssh連接到M2 Dock后,用vim編輯tuchuan.py并保存后,再執(zhí)行
python ./tuchuan.py運(yùn)行
方式1最方便,方式2最麻煩,方式3運(yùn)行效率最好。
建議一般玩家,選用方式1最合適了。
正確運(yùn)行以上代碼后,就能正常開啟圖傳功能了。
二、圖傳功能使用
要訪問(wèn)M2 Dock提供的圖傳功能,可以有幾種方式:
-
MaixPy3的網(wǎng)頁(yè)編輯界面中,運(yùn)行了圖傳功能開啟,運(yùn)行界面直接就調(diào)用了圖傳數(shù)據(jù)并呈現(xiàn)出來(lái)了,如上面的圖所示; -
如果是通過(guò)adb shell連接到M2 Dock執(zhí)行啟動(dòng)圖傳的代碼,那么可以使用
http://127.0.0.1:18811直接訪問(wèn),如:
-
如果是通過(guò)adb shell連接到M2 Dock執(zhí)行啟動(dòng)圖傳的代碼,且已經(jīng)聯(lián)網(wǎng)了,那么可以使用
http://設(shè)備ip地址:18811直接訪問(wèn),如:
- 還可以寫一個(gè)簡(jiǎn)單的網(wǎng)頁(yè),打開網(wǎng)頁(yè)直接訪問(wèn)(地址請(qǐng)參考2、3),如:
<img src="http://127.0.0.1:188811">

M2 Dock的這個(gè)圖傳地址http://127.0.0.1:18811的實(shí)際處理,使用的是在 MaixPy3 中內(nèi)置的 mjpg 包來(lái)進(jìn)行的。MJPG 編碼是一種常見且簡(jiǎn)易的視頻編碼方案,只需要將每一幀壓縮成 jpg 圖片后不斷發(fā)送給客戶端就行。
三、Lab閾值獲取
前面說(shuō)過(guò),機(jī)器視覺中會(huì)利用到Lab,同樣的,MaixPy3也提供了很簡(jiǎn)單的方法來(lái)應(yīng)用Lab閾值。
我們先想辦法,來(lái)得到一組合適的閾值,這可以使用HonestQiao/thresholding-filter-browser-html: Browser HTML opencv.js thresholding filter lab hsv binarize (github.com)工具。這個(gè)工具由Sipeed的大牛JunhuanChen提供,我fork源碼后做了一點(diǎn)點(diǎn)小修改,方便使用。
然后,開啟命令行,在上述下載的代碼目錄中,執(zhí)行如下命令,啟動(dòng)本地web服務(wù):
python -m SimpleHTTPServer 8888
如果執(zhí)行后提示:
No module named SimpleHTTPServer
那就換一條指令:
python -m http.server 8888
成功運(yùn)行后,會(huì)出現(xiàn)提示信息:
Serving HTTP on :: port 8888 (http://[::]:8888/) ...
然后,通過(guò)網(wǎng)頁(yè)訪問(wèn) http://127.0.0.1:8888/即可打開在線獲取Lab閾值頁(yè)面:

在該界面上,提供了一個(gè)默認(rèn)的色塊圖片;
你也可以上傳已有的圖片來(lái)進(jìn)行處理;

如果前面開啟了圖傳,那么可以設(shè)置圖傳地址:

根據(jù)使用的經(jīng)驗(yàn),我一般會(huì)這么進(jìn)行調(diào)整,來(lái)獲取需要的閾值。
例如,我想要獲取橙色色塊的閾值,那么,我會(huì)先調(diào)整a,達(dá)到如下的效果:

在上圖中,可以看到紅色色塊與橙色色塊接近,所以先讓這兩個(gè)色塊在右圖上,都呈現(xiàn)出白色區(qū)塊。而其他部分,都呈現(xiàn)為黑色。
然后,再調(diào)整L,使得顏色暗一些的紅色,被排除掉:

然后可以切換到魔方的其他面,并進(jìn)行微調(diào),確保能夠較好的識(shí)別各個(gè)面的橙色塊:

注意,獲取Lab閾值的時(shí)候,不要像下面這樣,把同一種顏色都擰到一面來(lái):

這樣確實(shí)很整齊,但是,我們不僅僅要獲取這種顏色的閾值,同時(shí),還得把其他干擾的顏色,給排除出去。
所以,把魔方打亂了去識(shí)別,效果會(huì)更好。
通過(guò)以上的方式,我們就能得到魔方六面6種顏色格子對(duì)應(yīng)的Lab閾值了。
but,but,but,經(jīng)過(guò)實(shí)際測(cè)試發(fā)現(xiàn),我手頭這個(gè)三階魔方,是比賽用的,貼紙半光高亮的,紅色和橙色,人看著挺好,但攝像頭不好區(qū)分。
于是,我把家里的魔方擺出來(lái),仔細(xì)挑了挑:
最后選擇了金字塔魔方,這個(gè)魔方是黑底的,顏色為紅黃藍(lán)綠四色,顏色分明,底色也不會(huì)干擾。
而白底的魔方,通常都有白色色塊,會(huì)造成干擾。
另外咱們現(xiàn)在還是做很基礎(chǔ)的實(shí)驗(yàn),所以也不能用純色的魔方。
挑選出來(lái)的金字塔魔方真身如下:

在我挑選魔方的時(shí)候,孩子很好奇我在干嘛,于是湊過(guò)來(lái)。
然后,然后孩子就占了主場(chǎng),不出一分鐘,就理解了Lab閾值的概念,并學(xué)會(huì)了怎么獲取Lab閾值:
所以下面的部分,主要由孩子完成,我提供技術(shù)支持和指導(dǎo)。
我們用一個(gè)手機(jī)支架,把M2 Dock支起來(lái),攝像頭對(duì)準(zhǔn)魔方:

然后在Lab閾值獲取界面,進(jìn)行閾值的調(diào)整查看:
最終,獲得了四組顏色對(duì)應(yīng)的嗯Lab閾值:
[(0, 100, -128, -23, -128, 127)], #綠色
[(10, 100, 30, 127, -37, 127)], #紅色
[(40, 100, -25, 42, 7, 127)], #黃色
[(0, 100, -128, 127, -128, -46)], #藍(lán)色
并參考官方的例子,編寫了下面的程序:
from maix import image, display, camera
color = [
[(0, 100, -128, -23, -128, 127)], #綠色
[(10, 100, 30, 127, -37, 127)], #紅色
[(40, 100, -25, 42, 7, 127)], #黃色
[(0, 100, -128, 127, -128, -46)], #藍(lán)色
] # 0.5.0 以后藍(lán)色的 lab 閾值,0.4.9 之前為 [(13, 11, -91, 54, 48, -28)]
font_color = [ # 邊框和文字顏色,暫時(shí)都用白色
(255,255,255), # 綠色
(255,255,255), # 紅色
(255,255,255), # 黃色
(255,255,255) # 白色
]
name_color = ('green', 'red', 'yellow', 'blue')
while True:
img = camera.capture()
for n in range(0,4):
blobs = img.find_blobs(color[n]) #在圖片中查找lab閾值內(nèi)的顏色色塊
if blobs:
for i in blobs:
if i["w"]>15 and i["h"]>15:
img.draw_rectangle(i["x"], i["y"], i["x"] + i["w"], i["y"] + i["h"],
color=font_color[n], thickness=1) #將找到的顏色區(qū)域畫出來(lái)
img.draw_string(i["x"], i["y"], name_color[n], scale = 0.8,
color = font_color[0], thickness = 1) #在紅色背景圖上寫下hello worl
display.show(img)
運(yùn)行上述代碼后,識(shí)別的效果如下:

從中可以看到,M2 Dock又快又好的識(shí)別出來(lái)了對(duì)應(yīng)的魔方色塊顏色。
當(dāng)然,因?yàn)楸尘邦伾忘S色接近,所以也被識(shí)別了。
可以找一張大的黑色膠片或者黑色紙,墊在下面和支在背后,這樣子就能消除干擾了。
識(shí)別視頻,詳見作者原帖子文章。
-
開發(fā)板試用
+關(guān)注
關(guān)注
3文章
303瀏覽量
2750
發(fā)布評(píng)論請(qǐng)先 登錄
【作品合集】矽速科技Sipeed MaixCAM Pro開發(fā)板測(cè)評(píng)
【作品精選】2025電子發(fā)燒友開發(fā)板測(cè)評(píng)大賽作品合集!
deepin 25成功適配魔方派3開發(fā)板
【Sipeed MaixCAM Pro開發(fā)板試用體驗(yàn)】 + 04 + 機(jī)器學(xué)習(xí)YOLO體驗(yàn)
【Sipeed MaixCAM Pro開發(fā)板試用體驗(yàn)】+ 02 + 基礎(chǔ)功能測(cè)試
有獎(jiǎng)丨米爾 瑞芯微RK3506開發(fā)板免費(fèi)試用
基于RK3576處理器,米爾RK3576開發(fā)板免費(fèi)試用
搭載OpenHarmony操作系統(tǒng),視美泰SC-3568HA開發(fā)板免費(fèi)試用
基于RK處理器,創(chuàng)龍TL3562-MiniEVM開發(fā)板試用體驗(yàn)
性能強(qiáng)悍!合眾HZ-RK3568開發(fā)板試用體驗(yàn)
免費(fèi)丨米爾 STM32MP257開發(fā)板有獎(jiǎng)試用
有獎(jiǎng)丨米爾 瑞芯微YR3562開發(fā)板免費(fèi)試用
有獎(jiǎng)試用!!RA-Eco-RA4M2-100PIN-V1.0開發(fā)板試用活動(dòng)報(bào)名
【Sipeed M2 Dock開發(fā)板試用體驗(yàn)】圖傳功能使用與魔方色塊尋找
評(píng)論