謝作如 林淼焱
DF論壇上有人發(fā)了一篇關(guān)于制作“變色龍”的文章,利用RGB全彩LED燈珠或燈帶,結(jié)合顏色識別傳感器,做一個能夠根據(jù)環(huán)境顏色發(fā)出不同光芒的“變色龍”(如圖1)。這一作品激起很多創(chuàng)客的興趣,于是大家就進(jìn)一步改造,讓這個“會變色”的作品越來越好玩。
這類變色主題的作品再多,也無非是利用了顏色傳感器,控制的還是REG燈,在我們看來都不夠好玩。在研究利用Wi-Fi控制互聯(lián)網(wǎng)智能燈泡的過程中,我們發(fā)現(xiàn)只要遵循一定的協(xié)議,控制物聯(lián)網(wǎng)家電并非難事。于是,本文繼續(xù)研究用虛谷號來控制Yeelight燈泡,做一個智能變色燈。和其他作品不同的是,我們用攝像頭或者高拍儀替代了顏色傳感器,并且控制的是220V“真正燈泡”。
作品原理分析
之所以用攝像頭來替代顏色傳感器,是因為前者不僅便宜,而且隨處可以獲取。利用攝像頭獲取顏色,可以借助于Python中的OpenCV庫,調(diào)用攝像頭拍照,并對拍到的圖像進(jìn)行處理分析,將圖像中的主要顏色分解為RGB三種顏色數(shù)值,再通過局域網(wǎng)發(fā)送控制指令使智能燈泡變色。
用虛谷號控制智能燈泡的原理,在本欄目上一期文章《讓創(chuàng)客空間的照明系統(tǒng)個性化起來》中已經(jīng)詳細(xì)介紹,這里不再贅述。Yeeligh燈泡支持局域網(wǎng)控制,能夠接收到局域網(wǎng)內(nèi)任一智能設(shè)備的控制指令,發(fā)送控制指令的設(shè)備可以是電腦、手機(jī),也可以是任何一個支持網(wǎng)絡(luò)功能的MCU,如掌控板、虛谷號和樹莓派等。
這個智能變色燈需要的器材很少,虛谷號加Yeelight智能燈泡、攝像頭就可以了,作品的工作流程如圖2所示。
用攝像頭獲取物體顏色的代碼實現(xiàn)
攝像頭前物體是什么顏色?看起來問題很簡單,但是讓計算機(jī)來回答并不容易。當(dāng)我們要判斷某個物體是什么顏色的時候,往往會先找出這一物體的最主要顏色,再判斷這一顏色和哪種顏色最接近。計算機(jī)雖然說不出天藍(lán)、橘黃之類的色彩名詞,但可以精確地分析出圖像中某一個像素點的RGB值,即RGB三種顏色的具體組成,但一個物體往往不會是純色的,所以要確定一張含有多種顏色的圖像的“顏色”,需要確定一個算法。
算法一:將這個圖像的所有像素點的RGB值分別相加,取出RGB三種顏色的平均值。如果擔(dān)心計算的效率太低,可以均勻地取出部分像素,應(yīng)該可以得到大致的顏色平均值。
算法二:利用濾鏡功能,給這個圖像加上RGB三種顏色遮罩,處理為黑白圖片,然后通過計算分別得到圖像的白色區(qū)域面積大小,換算為0~255之間的數(shù)值(如上頁圖3)。
其實,這兩種算法的原理是差不多的,只不過實現(xiàn)的方式不一樣。OpenCV庫作為著名的跨平臺計算機(jī)視覺庫,提供了很多圖像處理和計算機(jī)視覺方面的通用算法,可以很簡單地幫我們完成顏色分析的功能。核心代碼如圖4所示。
虛谷號控制物聯(lián)網(wǎng)燈泡的代碼實現(xiàn)
為方便用戶控制燈泡,Yeelight公司提供的一個小型庫,可讓用戶通過Wi-Fi發(fā)送指令來控制Yeelight燈泡。只要獲取了設(shè)備的IP地址,通過ON、OFF、Set_Color等簡單的函數(shù),就能調(diào)整燈泡的開關(guān)、顏色、亮度等參數(shù)。
需要強(qiáng)調(diào)的是,Yeelight燈泡要開啟“局域網(wǎng)控制”功能,默認(rèn)情況下這一功能是關(guān)閉的。另外,虛谷號和Yeelight燈泡一定要處于同一局域網(wǎng),即連接同一個無線路由器,才能通過指令來找到設(shè)備的IP地址。
控制燈泡顏色的參考代碼如圖5所示。
我們在虛谷號的論壇中,提供了更多關(guān)于Yeelight庫的教程,地址為:http://vvboard.net.cn/bbs/。
作品測試
為了讓獲取的物體顏色更加準(zhǔn)確,我們用高拍儀替代了普通攝像頭。因為高拍儀一般都自帶了用來補(bǔ)光的LED燈,可以避免色差。虛谷號支持絕大多數(shù)的免驅(qū)攝像頭和高拍儀,能夠做到即插即用。我們使用的高拍儀是良田的S系列。
作品的演示效果如圖6。默認(rèn)情況下燈光是白色的,當(dāng)在高拍儀下面放置不同的物體,燈光則會變成物體的顏色,識別速度很快。如果加上語音提示功能,這個作品就更加吸引人了。
從這個作品可以看出,借助Python的OpenCV庫,攝像頭獲取物體顏色非常方便,代碼簡單易懂。開源硬件虛谷號,不僅能夠用來編寫Arduino、Python、Processing等應(yīng)用,也可以用來做視覺識別、語言識別之類的人工智能應(yīng)用。在制作這個作品的時候,我們并不需要給虛谷號接上顯示器和鼠標(biāo)、鍵盤,只需要把在電腦中調(diào)試成功的Python代碼,復(fù)制到虛谷號的U盤中就可以正常執(zhí)行,進(jìn)而大大降低了應(yīng)用門檻。