(原文來源 電子芯吧客 在此特別鳴謝)
? ? ? ?1 制作背景
土貓之家是個保護(hù)流浪貓的民間組織,倡導(dǎo)領(lǐng)養(yǎng)代替買賣。本人于2015年底在該組織領(lǐng)養(yǎng)到了一只“主子”,是個自帶眼線的粉鼻子小母貓,從此熱情滿滿地成了一個名副其實(shí)的“貓奴”。
圖1 筆者領(lǐng)養(yǎng)的貓咪,名叫球球
養(yǎng)貓的人一般都自稱“貓奴”或是“鏟屎官”,然而這并不是指我們這些高貴的不愿做奴隸的社會主義公民被喵星人給奴役了,而是因?yàn)槲覀儼沿堖淇醋鍪羌彝ダ锩姹妒苣鐞鄣耐磔叀pB(yǎng)貓的人一般稱貓為“小皇上”或是“小主子”。當(dāng)然,這只是對乖巧可愛的小型貓咪的愛稱。體型大的橘喵就不是這個待遇了,一般被稱為“胖子”。
圖2 橘色的都容易胖(圖片來自網(wǎng)絡(luò))
出于對貓的溺愛,鏟屎官們都有這樣的想法,在家里裝一個監(jiān)控,上班時也可以偷窺一下主子的一舉一動。廠家們抓住這一需求,已經(jīng)向市場推出了一些產(chǎn)品。這些貓咪監(jiān)控產(chǎn)品往往是直接套用了面向家庭安防的監(jiān)控方案,并不能有效區(qū)別進(jìn)入識別區(qū)域的物體是人還是貓,并且對運(yùn)動物體的敏感性過高。有時候,它們會拍下一堆照片,但是照片上卻根本看不到貓。
圖3 網(wǎng)上售賣的寵物監(jiān)控器(圖片來自網(wǎng)絡(luò))
我們期待一種更穩(wěn)定的監(jiān)控方案,不會被各種風(fēng)吹草動給誤觸發(fā),也就是說——只拍有貓的照片。基于這種想法,筆者用樹莓派卡片電腦為喵星人量身定做了一個監(jiān)控攝像頭方案。所需硬件為樹莓派3B、樹莓派CSI攝像頭、5V2A的安卓手機(jī)電源和一個能接入互聯(lián)網(wǎng)的路由器。
圖4 安裝了SCI攝像頭的樹莓派卡片電腦
2 監(jiān)控原理
鏟屎官白天去上班以后,樹莓派在家通過CSI攝像頭捕獲圖像數(shù)據(jù),然后使用Haar分類器進(jìn)行貓臉檢測,成功檢測到貓臉后把圖像存為jpg格式的照片,照片發(fā)送到電子郵箱,讓你第一時間了解具體情況。
3 開發(fā)環(huán)境
程序是以源代碼方式提供給大家的,需要編譯運(yùn)行。所以,在開始工作前,先確保樹莓派上已經(jīng)部署了g++編譯器、opencv開發(fā)環(huán)境,并且bcm2835-v4l2驅(qū)動模塊已經(jīng)掛載。
發(fā)送電子郵件的功能是通過smtp服務(wù)實(shí)現(xiàn)的,確保樹莓派上已經(jīng)部署了msmtp和mutt發(fā)送電子郵件的環(huán)境。推薦使用163郵箱的smtp服務(wù)。
4 程序代碼
兩個文件haarcascade_frontalcatface.xml和cat.cpp,在附件里提供給大家。
https://pan.baidu.com/s/1eX6tvyS9bdDqpV4nrWh_JA
5 代碼使用方法
cat.cpp文件是算法代碼,你必須把電子郵件地址改成你自己的。
用文本編輯器打開cat.cpp文件,找到第21行if (k < 10),這個數(shù)字10是控制代碼循環(huán)計數(shù)的,變量k每10個循環(huán)置0。樹莓派3B大約需要15秒時間跑這10個循環(huán),如果你覺得發(fā)郵件頻率太慢,把這個10的值改成2或是5。如果覺得發(fā)郵件太頻繁,就改到20或是100。
找到第32行和34行與threshold相關(guān)的句子。這里的threshold是個濾波后的貓臉檢測結(jié)果,其值域在0到1之間。濾波的作用是為了過濾掉偶爾的誤判,畢竟Haar分類器的檢測結(jié)果也不是萬無一失的。這是個用加權(quán)平均法實(shí)現(xiàn)的低通濾波算法,如果要提高濾波算法的阻尼效果,可以把threshold+=1和threshold=threshold/2這兩句分別改成threshold+=0.5和threshold=threshold/1.5。
在代碼的第37行,找到if(threshold > 0.999&&k==0)這句話,意思是檢測到識別值大于0.999且循環(huán)計數(shù)值k等于0時,拍照并發(fā)送電子郵件。發(fā)送電子郵件的句子在第41行system("echo"cat face" | mutt -s "RaspberryCamera"news@news.ickey.cn -a cat.jpg"),你要把這個電子郵箱地址news@news.ickey.cn改成你自己的郵箱。為了防止郵件服務(wù)器拒收,推薦使用163郵箱。
代碼編譯命令g++ -ggdb cat.cpp -o iccat `pkg-config --cflags --libs opencv` 注意pkg-config --cflags --libs opencv要用英文單引號括起來。這樣就會生成一個名字叫iccat的可執(zhí)行文件。
代碼執(zhí)行命令 ./iccat
圖5 被Haar分類算法檢測到的球球
6?使用案例
喵星人監(jiān)控攝像頭做好了,但是視角只有65度,不可能監(jiān)控到整個屋子。既然只能監(jiān)控65度的視場區(qū)域,那么問題來了,我們把它對著哪里拍,才能更大的概率捕捉到貓咪呢?筆者推薦的位置是貓窩或者是你的床。畢竟,貓都是愛睡覺的,不然怎么叫懶貓呢。
圖6 湯姆也愛睡覺
筆者家里的球球也是特別喜歡上床的,每當(dāng)“鏟屎的”去上班了以后,這床就是她的了。不久前,筆者的163郵箱收到了一封郵件,正是喵星人監(jiān)控攝像頭發(fā)來的。郵件附件里是她上床被樹莓派逮了個正著的照片。
圖7 球球上床被抓了個現(xiàn)行
7 結(jié)果和展望
這種基于開源的計算機(jī)視覺算法的喵星人監(jiān)控攝像頭可以非常精準(zhǔn)地拍到有貓的照片。分類和濾波算法使它能很好地過濾干擾,不會被人、狗等目標(biāo)誤觸發(fā)。這種算法可以應(yīng)用于寵物醫(yī)院的自動門禁、機(jī)場的寵物安檢,或是寵物穿戴設(shè)備。
評論