模拟门铃识别-Arduino中文社区 - Powered by Discuz! Archiver

vincen20 发表于 2017-10-20 17:12

模拟门铃识别

本帖最后由 vincen20 于 2017-11-16 21:34 编辑

需要准备的基本硬件:树梅派3 *1块(16G高速TF卡1张,树梅派电源模块1 套,树梅派盒子1个,TF卡读卡器1个,带HDMI接口的显示屏,HDMI线,USB键盘,鼠标),USB高清摄像头*1个,摄像头支架1 个,WIFI环境,3.5MM音频线,音响
软件:
树梅派系统(RASPBIAN STRETCH WITH DESKTOP),
SD Formatter
OPENCV开发环境(3.3.0-dev),fswebcam,mplayer2,python2.7


step 1
准备设备:
烧写系统,(略)
树梅派系统安装,选择官方(RASPBIAN STRETCH WITH DESKTOP),建议使用英语语言,安装过程略,默认用户名pi,密码raspberry
安装完成后,
连接显示器,上电 ,配置WIFI,启用VNC,首次使用VNC会提示修改默认密码,(重要)需要注册VNC账号,使用VNC云服务,设置完VNC后,就可以把去掉显示器,去掉usb键盘,通过手机,电脑使用 VNC viwer远程访问树梅派系统了,这个很方便实用 。
升级系统
打开终端命令
sudo apt-get update
sudo apt-get upgrade
sudo apt-get rpi-update
到此树梅派准备完毕。
安装OPENCV
参考官方教程
https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html本来需要很多安装包,由于树梅派继承了大部分,安装起来还是容易。
先安装依赖包
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

下载OPENCV
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
编译OPENCV
在OPENCV目录下新建build配置
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ../
编译
make -j2 # 并行数,不建议太大,容易造成VNC服务卡死。
安装
sudo make install
测试
进入OPENCV安装目录下的sample/python,使用右键用PYTHON IDE打开,如果能看到摄像头拍到的视频图像,(先把摄像头连接上),那么安装就成功了。
在sample目录下有很多写好的程序,可以参考下。
其他软件安装
本来计划的是直接捕获摄像头中的帧,来判断人的面部,由于对技术不太熟悉,导致使用该方法导致的是树梅派CPU占用太高,从视频中获取的图像分辨率低等原因,
故采取了让OPENCV 直接处理图片来识别人像,该方法优点是捕获的图片分辨率较高,处理速度快,占用的CPU资源不高的优点。
所以需要使用fswebcam,安装命令sudo apt-get install fswebcam
fswebcam 使用简单,直接在终端个输入
( 没有测试过使用OPENCV捕获图片的情况,可以测试下)
fswebcam -d /dev/video0 -r 1920x1024    image.jpg
就可以抓取当前时刻的图像,并存到当前目录下,在配合LINUX系统的crontab任务计划,可以实现定时抓拍图片。
安装音频播放软件mplayer2,当检测到人时候,播放提示声音。
sudo apt-get install mplayer2
下载门铃声音(GITHUB)
到此准备工作基本完成。
硬件、软件准备好后需要介绍下本项目的设计思路理论知识准备:
python 编程技术,opencv , Haar   Cascades 人脸检测理论                                 

参考链接http://opencv-python-tutroals.readthedocs.io/en/latest/
项目设计思路:利用树梅派抓取门外的图像保存并上传到网络,然后使用OPENCV分析,如果检测到人脸,使用树梅派结合喇叭播放预先录制的声音。

备注(由于多种原因,且门外按照树梅派不方便,计划采用采集电视机上图像来模拟实际效果)根据流程图
捕获图片:
通过fswebcam捕获图片,为了方便以后查找,可以在图片底部增加捕获的时间精确到秒,保存的文件名也用年月日时分秒组成.
time_now = time.strftime('%Y-%m-%d-%H-%M-%S')
cmds= 'fswebcam -d /dev/video0 -r 1920x1024 -S 10 --bottom-banner --title Syspic@"%s" --no-timestamp image/"%s".jpg'

图片上传到网络(只存储,不做其他应用)
本来计划把图片传到yeelink,结果发现yeelink不稳定,无赖,只能选择试用的存储地方。
经过查找,发现现在的云存储很流行,于是选择了使用qcloud腾讯云作为图片存储地。
申请很简单,只需要1分钱就可以完成认证。
为节约成本,推荐选择《云对象存储》,中的Bucket 存储图片对象。
创建bucket


记住选择的地域后面需要修改代码。
下载SDK代码
python 下载代码: https://mc.qcloudimg.com/static/ ... n-sdk-v4-master.zip
根据教程安装SDK ,由于要求python2.7,还好树梅派系统中的终端支持2.7版本运行。
安装完成后,初始化客户端,根据要求修改的sample.py文件内容
   appid = 100000                  # 替换为用户的appid
   secret_id = u'xxxxxxxx'         # xxx替换为用户的secret_id
   secret_key = u'xxxxxxx'         # xxxx替换为用户的secret_key
   region_info = "chengdu"      #

    bucket = u'rasp'
根据提示接收短信验证码获取上面的数据。
由于默认代码,没 有chengdu服务器的地址,需要修改
qcloud_cos目录下cos_config.py文件,
添加代码
      if region in ['cd', 'chengdu']:
            self._hostname = 'cd.file.myqcloud.com'
            self._download_hostname = 'cossh.myqcloud.com'

保存 ,退出。(参考代码附件)
当然需要根据你所在地域的名称来确定。
把sample.py内除上传文件以外的代码删除,
修改完成后,通过终端运行
suodo chmod +x./sample.py
./samply.py
如果得到 success关键字,说明上传成功。

登录qcloud查看Bucket中的内容,可以看到

数据上传成功。
opencv 人脸检测
根据Haar   Cascades 人脸检测理论   ,需要准备符合人脸的特征,这些特征称为 Cascades,具体的就是XML文件。
所以需要拷贝用于人脸,眼睛,鼻子,嘴跟踪的XML文件(参考代码附件),这些文件代表了不同的特征,可以更具具体情况进行修改。

haarcascade_eye_tree_eyeglasses.xml
haarcascade_eye.xml
haarcascade_frontalcatface_extended.xml
haarcascade_frontalcatface.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_default.xml
haarcascade_fullbody.xml
haarcascade_lefteye_2splits.xml
haarcascade_licence_plate_rus_16stages.xml
haarcascade_lowerbody.xml
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_russian_plate_number.xml
haarcascade_smile.xml
haarcascade_upperbody.xml

可以在OPENCV 目录下找到文件,经过测试,默认情况下使用的是
haarcascade_frontalface_default.xml该文件,根据字面意思,是检测的是正面面部,为了增大检测读
在正面没有检测到时,增加全身,前面部等多个检测,虽然会消耗些时间,但是相对来说比较准确。
在测试时候发现,需要把摄像头放到足够光线好的地方,光线暗会影响检测效果
不知道是不是这个算法要把图片转换为灰度级别的原因。
理论基本介绍完毕,需要说明的是,本人也是新手,望大家多多指导
参考代码放到GITHUB
https://github.com/vincen20/raspberry-_opencv_doorbellhttp://v.youku.com/v_show/id_XMzEyOTUzNDkzNg==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2
视频外部链接56视频156视频Url
FLV源文件



























syl312 发表于 2017-10-29 22:31

1.感谢对社区比赛的支持,开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
2.比赛结果会在11.15号前公布,请耐心等待。
页: [1]
查看完整版本: 模拟门铃识别