查看: 3654|回复: 4

[对决赛] 宠物感应拍照机

[复制链接]
本帖最后由 yoyojacky 于 2015-9-27 14:46 编辑

项目主要目的是为了能够随时随地和家人朋友分享家中爱宠的照片信息,由于工作繁忙,没有太多时间去关照家里的宠物,更别说拍照片了,所以萌发了想给家中的狗狗拍照片的想法。
之前想过用山狗和树莓派来搭建,但是都没有去做,因为两个问题,第一个如果用树莓派的官方摄像头,不太好集成到我的程序里面,只能通过shell脚本来实现,不够高端大气上档次。。。如果用Arduino有觉得摄像头不好控制。。。。后来参加blueeye做无人船的时候,大熊借给我一块Edison,所以决定用edison去实现拍照的功能,是不是有作死的感觉,通过查阅资料,看到edison的运算性能非常不错,又非常的低功耗,也有大神已经实现了在edison上跑opencv的实践。

因此就想的用edison结合传感器来实现拍照了。实现的原理很简单,在大牛的眼里,就是小儿科啊。。。我只用了一个传感器,就是人体红外热释传感器,也叫运动传感器,就是如果传感器感应到有运动物体就会产生电平的高低变化(因为这是一个数字传感器),通过程序判断电平的高低变化就可以实现对运动物体的检测,然后通过edison结合opencv的视觉库,进行抓图的操作,并存入一张照片,然后利用定时脚本将拍摄的照片通过wifi传入阿里云服务器,再通过编辑好的页面展示出来。这样,不管是在任何地方,任何时间,只要萌宠经过传感器的前方,就会被感应到,并且被拍照上传服务器。我和我的朋友家人就可以通过手机或者电脑,随时随地的访问这些图片了。当然,后期会考虑如果涉及到安全和隐私的话,我们会加入验证环节。另外,通过在喂食盆附近的放置该设备,还可以通过对图片的统计算出宠物被感应到的次数,就可以绘制出一个曲线,判断萌宠饥饿的程度,然后提供的数据可以总结后设置一个自动喂食机构,在达到阈值就投放食物,真是宠物用品界的大数据分析和应用啊!
想法诞生的时候只是简单画了个图:
901678839.jpg

然后为了增加吸引眼球的元素,加入了我之前打印的3D暴龙头骨,美其名曰,恐吓图腾。哈哈,为了防止萌宠过来跪舔摄像头。(理由好牵强)
1495356751.jpg

然后现场制作:
制作过程中由于大家都太专注,拍摄的图片少,大家凑合看啦,头骨是用502粘到俞廷同学设计和打印的3D外壳上的。制作需要的物件:
Edison 一块
Edison扩展板  一块
还要一块很重要的设备,就是DFRobot的一块I/O extended sheild,有了它,一切变得更加简单了。

母对母头杜邦线 x 3
270度摄像头一个
人体红外热释传感器 一个

构建过程极其简单,我将人体红外热释传感器通过线缆接入到i/o扩展板的7号接口,记得看清楚pin脚的描述。
vcc----接5v
GND---接地
sign----接io扩展板的pin脚。
摄像头-----接usb接口(唯一一个宽口的USB)
然后刷入yoctolinux系统,这个过程需要用到:
3D577172-1147-4F69-9C23-D80DBFB47DCF.png

具体刷系统的过程就不写了。很简单,intel官方网站有,请自行搜索。
然后启动edison的时候通过串口连入edison:
这里要简单说明一下,edison有两个microusb的接口。和我们用的android手机充电接口一样,
最下面的那个是调试串口,上面的一个小的microusb是和大口usb共用的,靠一个switch来控制。
这个实验里面我已经把switch拨到靠近大usb口的位置了,所以大的usb将会得到应用。小的可以做为供电。
然后通过电脑连接串口进行查看。
因为我的电脑是mac,所以我用的的方法和大家不一样,如果是windows就用putty去连接设备。
1.png

连接的时候先查询一下自己连上来后被识别出来的串口设备文件:
我这里是:
2.png
接下来就利用screen命令进行访问。
#screen  /dev/tty.usbserial-AJ03613A   115200
这里我的设备名称和大家的可能不一样,根据实际情况选择就好,
115200是波特率,就是和edison通信的速率。大家照着填写就好了。
如果登陆成功显示就是如下内容:
3.png
然后通过root登陆,初始密码是空。
我一般登陆后要做一些简单的初始化工作:
例如配置edison的主机名,连接wifi,设置软件的源,修改root密码等等。
4.png
利用configure_edison 命令,可以去配置很多东西。
例如我想配置密码就:
#configure_edison  --password
如果想配置wifi就:
#configure_edison --wifi
然后按照提示一步一步完成就好。很简单。

5.png
然后会有提示:
6.png

我家里的wifi的ssid是yoyojacky,所以我就选择24。
下面就是询问是否正确,填写密码就好了。
7.png

我看到我已经获取到IP地址了。后期就可不用串口线,直接通过wifi网络直接连接设备了。
然后就是修改配置源:
#vi  /etc/opkg/base-feeds.conf
8.png

接下来就是安装opencv的一些库。我安装的opencv版本是:
9.png

剩下就是创建一个目录去写程序了。
opencv的源代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <pthread.h>

  6. #include <mraa/gpio.h>

  7. int ir_state = 0;

  8. void *take_photo_thread (void *args){
  9.     for(;;){
  10.         if(ir_state /* || 1 */){
  11.             char str[25];
  12.             sprintf(str,"%d.jpg",(int) time((time_t*)NULL));
  13.             //printf("%s\n",str);
  14.             take_photo(str);
  15.             sleep (1);
  16.             //char command[100];
  17.             //sprintf (command, "./upload.sh %s", str);
  18.             //system (command);
  19.             char command[120];
  20.             sprintf(command,"curl --form "fileupload=@%s"  http://www.lisperli.org/upload/?upload=yes",str);
  21.             system  (command);
  22.         }
  23.         sleep(1);
  24.     }
  25. }

  26. int main(int argc, char** argv)
  27. {
  28.     mraa_gpio_context ir_gpio = NULL;

  29.     ir_gpio = mraa_gpio_init(7);

  30.     if (ir_gpio == NULL) {
  31.         fprintf(stdout, "Could not initilaize ir_gpio\n");
  32.         return 1;
  33.     }

  34.     mraa_gpio_dir(ir_gpio, MRAA_GPIO_IN);

  35.     pthread_t t;
  36.     pthread_create(&t,NULL,take_photo_thread,NULL);
  37.     //pthread_join(t,NULL);

  38.     for (;;) {
  39.         if( ir_state != mraa_gpio_read(ir_gpio)) {
  40.             ir_state = !ir_state;
  41.             printf("%d\n",ir_state);
  42.             sleep(1);
  43.         }
  44.     }

  45.     return 0;
  46. }
复制代码

main.c
2.main.cpp (原始的,上面那段是由FireZ小伙子写的。—注释回头加上)
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include "opencv2/opencv.hpp"
  4. #include "opencv2/core/core.hpp"
  5. #include "opencv2/video/background_segm.hpp"
  6. #include "opencv2/imgproc/imgproc_c.h"
  7. #include "opencv2/imgproc/imgproc.hpp"
  8. #include "opencv2/legacy/legacy.hpp"
  9. #include "opencv2/video/tracking.hpp"
  10. #include "opencv2/photo/photo.hpp"

  11. using namespace std;

  12. extern "C" void take_photo(char *str);
  13. void take_photo(char *str)
  14. {
  15.     IplImage *frame = NULL;
  16.     int num = 0;
  17.     int key;
  18.     CvCapture *input_camera = cvCaptureFromCAM(0);
  19.     frame = cvQueryFrame(input_camera);
  20.     while(frame != NULL)
  21.     {
  22.         num++;
  23. //       cout<<"get picture...." <<endl;
  24.         frame = cvQueryFrame(input_camera);
  25.         if(num == 20)
  26.         {
  27.             cvSaveImage(str,frame);
  28.             break;

  29.         }
  30.     }
  31.     cvReleaseCapture(&input_camera);
  32. }
复制代码
还有一个upload.sh的脚本,它主要的作用就是将照片传到阿里云端,内容也很简单:
  1. cho "$1"
  2. file=fileupload=@$1
  3. echo $file
  4. out =  `curl "$file"  http://www.lisperli.org/upload/?upload=yes`
  5. echo $out
  6. sleep 1
  7. rm $1
复制代码
shell脚本记得加执行权限:
#chmod +x   upload.sh
还有一个Makefile:
  1. GCC_MRAA_FLAG=-lmraa -lpthread
  2. GXX_OPENCV_FLAG=-lopencv_core -lopencv_highgui -lopencv_video -lopencv_calib3d -lopencv_contrib -lopencv_stitching -lopencv_superres -lopencv_legacy -lopencv_nonfree -lopencv_videostab -lopencv_gpu -lopencv_photo -lopencv_flann -lopencv_features2d -lopencv_ml -lopencv_imgproc -lopencv_objdetect

  3. build: main.o mycam.o
  4.         gcc main.o mycam.o -lstdc++ $(GXX_OPENCV_FLAG) $(GCC_MRAA_FLAG) -o main

  5. run: build
  6.         ./main

  7. main.o: main.c
  8.         gcc -c $(GCC_MRAA_FLAG) main.c

  9. mycam.o: mycam.cpp
  10.         g++ -c $(GXX_OPENCV_FLAG) mycam.cpp

  11. clean:
  12.         -rm main *~ *.o *.png
复制代码
编译的过程不用说了吧?直接make就好了。如果要整个项目的代码也可以去我的github下载:
https://github.com/yoyojacky/Pet-Camera ,这个pet-camera是从FireZ的github上fork过来的。
大家如果用linux系统就直接可以通过:
#git clone  https://github.com/yoyojacky/Pet-Camera 就可以拿到了。
程序搞定后,在终端执行:
#nohup  ./main  &   
就可以开始抓拍照片并上传了。
nohup主要是不要让进程运行随着用户退出挂掉。&是放到后台去执行。
这些搞定后,就开始做外壳了。。
为了简单快捷,我们只是设计了一个方形的盒子,留出了传感器和摄像头的位置。
238315385.jpg
这是我们的盒子的设计师。。。
(回眸一笑百媚生。平时他不太扣鼻屎,但是微信里面一说话,
开头必须先一个扣鼻屎的表情。。也是醉了。)
据说但是打印的时候用的时df的overload(好想有一台)。。。
当时盒子打印了一晚上。我们第二天才拿到。
2086931669.jpg
虽然程天纬小朋友才14岁,但是编程的理念杠杠滴,他是由他母亲带来观摩学习的,也不容易啊。。。
这就是传说中的后浪。。。。
随便把咱拍死在沙滩上。。。。
76419907.jpg

还有FireZ,一个神秘而低调的小伙子,技术赞赞的。我这里咩有他单独的照片。遗憾。。。。
给大家留个悬念吧。彩蛋去最后一张获奖图片里面找。
lisper.li ---- 网页大牛,自己拥有一个阿里云的平台(我也有。。呵呵)这次的照片都是传到他的网站上哦。
王昊翔---- 网页前端后端一样牛的大牛,具体战斗指数不详,因为我这次做队长主要是服务好大家。哈哈
是不是有点儿跑题了。。。哦,言归正传吧。。
接下来就是各种组装,组装还是我来做吧。
热熔胶枪创客必备杀器。。。
还有各种胶水。。。哎。。。第一版的就只能搞成这样了。
摄像头和感器是通过热熔胶固定的。。。(好简陋)
719393856.jpg
做完的成品。
再帖两张:
1097697221.jpg 2024036774.jpg
然后由lisper和王昊翔,还有田小姐,程天玮(年纪最小)一起构建的阿里云网页后台。
展示效果如下,有密集恐惧症的童鞋慎入啊!
链接地址: www.lisperli.org
截图如下:
请忽略拍到我的大肚皮。。。
2063259541.jpg

比赛结果出来了,万万没想到我们能获奖,我觉得我们做的很简单。谢谢评委厚爱。
1864996429.jpg





丄帝De咗臂  版主

发表于 2015-9-21 19:32:26

获奖了吗,恭喜啊
回复 支持 反对

使用道具 举报

大连林海  初级技神

发表于 2015-9-21 19:55:16

这个不错
回复 支持 反对

使用道具 举报

yoyojacky  初级技匠
 楼主|

发表于 2015-9-27 14:47:13


谢谢,做的一般般。。。
回复 支持 反对

使用道具 举报

yoyojacky  初级技匠
 楼主|

发表于 2015-9-27 14:47:36


关键是狗现在不敢出现在镜头里了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail