(原文来源 电子芯吧客 在此特别鸣谢)
1 制作背景
土猫之家是个保护流浪猫的民间组织,倡导领养代替买卖。本人于2015年底在该组织领养到了一只“主子”,是个自带眼线的粉鼻子小母猫,从此热情满满地成了一个名副其实的“猫奴”。
图1 笔者领养的猫咪,名叫球球
养猫的人一般都自称“猫奴”或是“铲屎官”,然而这并不是指我们这些高贵的不愿做奴隶的社会主义公民被喵星人给奴役了,而是因为我们把猫咪看做是家庭里面倍受溺爱的晚辈。养猫的人一般称猫为“小皇上”或是“小主子”。当然,这只是对乖巧可爱的小型猫咪的爱称。体型大的橘喵就不是这个待遇了,一般被称为“胖子”。
图2 橘色的都容易胖(图片来自网络)
出于对猫的溺爱,铲屎官们都有这样的想法,在家里装一个 监控 ,上班时也可以偷窥一下主子的一举一动。厂家们抓住这一需求,已经向市场推出了一些产品。这些猫咪监控产品往往是直接套用了面向家庭安防的监控方案,并不能有效区别进入识别区域的物体是人还是猫,并且对运动物体的敏感性过高。有时候,它们会拍下一堆照片,但是照片上却根本看不到猫。
图3 网上售卖的宠物监控器(图片来自网络)
我们期待一种更稳定的监控方案,不会被各种风吹草动给误触发,也就是说——只拍有猫的照片。基于这种想法,笔者用 树莓派 卡片电脑为喵星人量身定做了一个监控摄像头方案。所需硬件为树莓派3B、树莓派 CSI 摄像头、5V2A的安卓手机电源和一个能接入互联网的路由器。
图4 安装了SCI摄像头的树莓派卡片电脑
2 监控原理
铲屎官白天去上班以后,树莓派在家通过CSI摄像头捕获图像数据,然后使用Haar分类器进行猫脸检测,成功检测到猫脸后把图像存为jpg格式的照片,照片发送到电子邮箱,让你第一时间了解具体情况。
3 开发环境
程序是以源代码方式提供给大家的,需要编译运行。所以,在开始工作前,先确保树莓派上已经部署了g++编译器、opencv开发环境,并且bcm2835-v 4l 2驱动模块已经挂载。
发送电子邮件的功能是通过 smt p服务实现的,确保树莓派上已经部署了msmtp和mutt发送电子邮件的环境。推荐使用163邮箱的smtp服务。
4 程序代码
两个文件haarcascade_frontalcatface.xml和cat.cpp,在附件里提供给大家。
https://pan.b ai du.com/s/1eX6tvyS9bdDqpV4nrWh_JA
5 代码使用方法
cat.cpp文件是算法代码,你必须把电子邮件地址改成你自己的。
用文本编辑器打开cat.cpp文件,找到第21行 if (k < 10),这个数字10是控制代码循环计数的,变量k每10个循环置0。树莓派3B大约需要15秒时间跑这10个循环,如果你觉得发邮件频率太慢,把这个10的值改成2或是5。如果觉得发邮件太频繁,就改到20或是100。
找到第32行和34行与threshold相关的句子。这里的threshold是个滤波后的猫脸检测结果,其值域在0到1之间。滤波的作用是为了过滤掉偶尔的误判,毕竟Haar分类器的检测结果也不是万无一失的。这是个用加权平均法实现的低通滤波算法,如果要提高滤波算法的阻尼效果,可以把threshold+=1和threshold=threshold/2这两句分别改成threshold+=0.5和threshold=threshold/1.5。
在代码的第37行,找到if(threshold > 0.999&&k==0)这句话,意思是检测到识别值大于0.999且循环计数值k等于0时,拍照并发送电子邮件。发送电子邮件的句子在第41行sys te m("echo\"cat face\" | mutt -s \"RaspberryCamera\"news@news.ickey.cn -a cat.jpg"),你要把这个电子邮箱地址news@news.ickey.cn改成你自己的邮箱。为了防止邮件服务器拒收,推荐使用163邮箱。
代码编译命令g++ -ggdb cat.cpp -o iccat `pkg-config --cflags --libs opencv` 注意pkg-config --cflags --libs opencv要用英文单引号括起来。这样就会生成一个名字叫iccat的可执行文件。
代码执行命令 ./iccat
图5 被Haar分类算法检测到的球球
6 使用案例
喵星人监控摄像头做好了,但是视角只有65度,不可能监控到整个屋子。既然只能监控65度的视场区域,那么问题来了,我们把它对着哪里拍,才能更大的概率捕捉到猫咪呢?笔者推荐的位置是猫窝或者是你的床。毕竟,猫都是爱睡觉的,不然怎么叫懒猫呢。
图6 汤姆也爱睡觉
笔者家里的球球也是特别喜欢上床的,每当“铲屎的”去上班了以后,这床就是她的了。不久前,笔者的163邮箱收到了一封邮件,正是喵星人监控摄像头发来的。邮件附件里是她上床被树莓派逮了个正着的照片。
图7 球球上床被抓了个现行
7 结果和展望
这种基于开源的 计算机 视觉算法的喵星人监控摄像头可以非常精准地拍到有猫的照片。分类和滤波算法使它能很好地过滤干扰,不会被人、狗等目标误触发。这种算法可以应用于宠物医院的自动门禁、机场的宠物安检,或是宠物穿戴设备。