本文來源電子發燒友社區,作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2290503_1_1.html
根據最近官方MaixPy3和M2 Dock的知識,參考官方文檔和樣例,在官方大牛的支持下,學習了基礎的魔方色塊的尋找功能,并以此分享給大家。
目錄:
- 基礎知識普及:圖傳與Lab顏色系統
- M2 Dock圖傳功能開啟
- 圖傳功能使用
- Lab閾值獲取
- 魔方色塊尋找
一、基礎知識普及
-
圖傳:
圖傳的概念,在無人機中非常常見,簡單來講,就是把攝像頭拍攝的實時視頻,又快又好的傳遞到終端設備上呈現,既要速度,不能卡,卡了沒意思,也要質量,清晰度不能低,低了沒得玩。而傳輸速度快,質量高,又可能占用較多的設備資源,以及需要較大的帶寬,所以設計一個上好的圖傳方案和系統,是很多該行業廠家的重大追求目標之一。 -
Lab:
Lab是一種用數字化的方法來描述人的視覺感應的顏色系統。它是一種設備無關的、基于生理特征的顏色系統。在機器視覺中,Lab的概念會經常提及。
可以用一張圖,來詳細描述Lab顏色空間:
上述圖,是從人的視覺感應角度來看的。
首先是L:表示亮度,從純黑到純白,取值可以從 0 -> 100
然后是a:表示從紅色到綠色的范圍,取值可以從 -128 -> 127
最后是b:表示從藍色到黃色的范圍,取值可以從 -128 -> 127
通常,Lab會以范圍的形式來表示,也就是Lab閾值,因為因為現場環境的不同,我們看到的顏色,不可能是完完全全的理論純色,所以給出一定的容錯范圍;
例如:[(0, 100, 21, 127, -128, -9)],分別表示:L-min、L-max、a-min、a-max、b-min、b-max,機器視覺就根據這個范圍,來進行顏色判斷。
二、M2 Dock圖傳功能開啟
了解了以上的基礎概念后,我們就可以進入正題,在M2 Dock上,具體使用相關的功能。
得益于MaixPy3
的強大,不用10行代碼,就能開啟M2 Dock的圖傳功能,以下為實際的代碼:
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)
要運行上述代碼,方法很多:
-
在
MaixPy3
的網頁編輯界面中,運行上述代碼: - 可以用adb shell或者ssh連接到M2 Dock后,運行python后,再輸入代碼運行
-
也可以用adb shell或者ssh連接到M2 Dock后,用vim編輯tuchuan.py并保存后,再執行
python ./tuchuan.py
運行
方式1最方便,方式2最麻煩,方式3運行效率最好。
建議一般玩家,選用方式1最合適了。
正確運行以上代碼后,就能正常開啟圖傳功能了。
二、圖傳功能使用
要訪問M2 Dock提供的圖傳功能,可以有幾種方式:
-
MaixPy3
的網頁編輯界面中,運行了圖傳功能開啟,運行界面直接就調用了圖傳數據并呈現出來了,如上面的圖所示; -
如果是通過adb shell連接到M2 Dock執行啟動圖傳的代碼,那么可以使用
http://127.0.0.1:18811
直接訪問,如: -
如果是通過adb shell連接到M2 Dock執行啟動圖傳的代碼,且已經聯網了,那么可以使用
http://設備ip地址:18811
直接訪問,如: - 還可以寫一個簡單的網頁,打開網頁直接訪問(地址請參考2、3),如:
<img src="http://127.0.0.1:188811">
M2 Dock的這個圖傳地址http://127.0.0.1:18811
的實際處理,使用的是在 MaixPy3 中內置的 mjpg 包來進行的。MJPG 編碼是一種常見且簡易的視頻編碼方案,只需要將每一幀壓縮成 jpg 圖片后不斷發送給客戶端就行。
三、Lab閾值獲取
前面說過,機器視覺中會利用到Lab,同樣的,MaixPy3也提供了很簡單的方法來應用Lab閾值。
我們先想辦法,來得到一組合適的閾值,這可以使用HonestQiao/thresholding-filter-browser-html: Browser HTML opencv.js thresholding filter lab hsv binarize (github.com)工具。這個工具由Sipeed的大牛JunhuanChen提供,我fork源碼后做了一點點小修改,方便使用。
然后,開啟命令行,在上述下載的代碼目錄中,執行如下命令,啟動本地web服務:
python -m SimpleHTTPServer 8888
如果執行后提示:
No module named SimpleHTTPServer
那就換一條指令:
python -m http.server 8888
成功運行后,會出現提示信息:
Serving HTTP on :: port 8888 (http://[::]:8888/) ...
然后,通過網頁訪問 http://127.0.0.1:8888/即可打開在線獲取Lab閾值頁面:
在該界面上,提供了一個默認的色塊圖片;
你也可以上傳已有的圖片來進行處理;
如果前面開啟了圖傳,那么可以設置圖傳地址:
根據使用的經驗,我一般會這么進行調整,來獲取需要的閾值。
例如,我想要獲取橙色色塊的閾值,那么,我會先調整a,達到如下的效果:
在上圖中,可以看到紅色色塊與橙色色塊接近,所以先讓這兩個色塊在右圖上,都呈現出白色區塊。而其他部分,都呈現為黑色。
然后,再調整L,使得顏色暗一些的紅色,被排除掉:
然后可以切換到魔方的其他面,并進行微調,確保能夠較好的識別各個面的橙色塊:
注意,獲取Lab閾值的時候,不要像下面這樣,把同一種顏色都擰到一面來:
這樣確實很整齊,但是,我們不僅僅要獲取這種顏色的閾值,同時,還得把其他干擾的顏色,給排除出去。
所以,把魔方打亂了去識別,效果會更好。
通過以上的方式,我們就能得到魔方六面6種顏色格子對應的Lab閾值了。
but,but,but,經過實際測試發現,我手頭這個三階魔方,是比賽用的,貼紙半光高亮的,紅色和橙色,人看著挺好,但攝像頭不好區分。
于是,我把家里的魔方擺出來,仔細挑了挑:
最后選擇了金字塔魔方,這個魔方是黑底的,顏色為紅黃藍綠四色,顏色分明,底色也不會干擾。
而白底的魔方,通常都有白色色塊,會造成干擾。
另外咱們現在還是做很基礎的實驗,所以也不能用純色的魔方。
挑選出來的金字塔魔方真身如下:
在我挑選魔方的時候,孩子很好奇我在干嘛,于是湊過來。
然后,然后孩子就占了主場,不出一分鐘,就理解了Lab閾值的概念,并學會了怎么獲取Lab閾值:
所以下面的部分,主要由孩子完成,我提供技術支持和指導。
我們用一個手機支架,把M2 Dock支起來,攝像頭對準魔方:
然后在Lab閾值獲取界面,進行閾值的調整查看:
最終,獲得了四組顏色對應的嗯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)], #藍色
并參考官方的例子,編寫了下面的程序:
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)], #藍色
] # 0.5.0 以后藍色的 lab 閾值,0.4.9 之前為 [(13, 11, -91, 54, 48, -28)]
font_color = [ # 邊框和文字顏色,暫時都用白色
(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閾值內的顏色色塊
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) #將找到的顏色區域畫出來
img.draw_string(i["x"], i["y"], name_color[n], scale = 0.8,
color = font_color[0], thickness = 1) #在紅色背景圖上寫下hello worl
display.show(img)
運行上述代碼后,識別的效果如下:
從中可以看到,M2 Dock又快又好的識別出來了對應的魔方色塊顏色。
當然,因為背景顏色和黃色接近,所以也被識別了。
可以找一張大的黑色膠片或者黑色紙,墊在下面和支在背后,這樣子就能消除干擾了。
識別視頻,詳見作者原帖子文章。
-
開發板試用
+關注
關注
3文章
301瀏覽量
2116
發布評論請先 登錄
相關推薦
評論