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