硬件环境:
飞凌OK6410开发板
OV9650摄像头
目标要求:
通过开发板平台,上传摄像头采集的图像。
步骤:
1.开发板驱动摄像头显示;
2.搭建web服务器,通过浏览器查看摄像头图像;
3.抓取网页图像
4.上传至yeelink
5.通过motion软件包实现图像的监控
系统硬件图,有图有真相:
参考资料
1.huawei hg255d(openwrt)+logitech c270+ wget&http-post 上传yeelink
http://bbs.yeelink.net/thread-188-1-1.html
2.图像侦测:探测运动的软件包motion
http://skpsun.blog.163.com/blog/static/27600552009121109154/
3.发送图像:linux下使用sendmail发送带附件的邮件
http://jamesbond0479.blog.163.com/blog/static/241475820115229336243/
步骤1
【问题1】
烧写如官方提供的uboot、zImage、rootfs.yaffs2,然后使用#testcamera命令测试摄像头,屏幕没有反应,打印消息如下:
[root@FORLINX6410]# ./testcamera
Start Main
already open the devicise codec
Before openning FB
VIDIOC_S_FMT is c0cc5605
VIDIOC_STREAMON is 40045612
start to get pic 0
而且点击QT界面下的照相机,提示信息no camera。
【猜想】
是不是PIC总线没有在内核勾选?
│ Location: │
│ -> Device Drivers │
│ -> Staging drivers (STAGING [=n]) │
│ -> Data acquisition support (comedi) (COMEDI [=n]) │
│ -> Comedi PCI drivers (COMEDI_PCI_DRIVERS [=n])
Location: │
│ -> Device Drivers │
│ -> HID Devices (HID_SUPPORT [=y]) │
│ -> Special HID drivers │
│ -> PicoLCD (graphic version) (HID_PICOLCD [=n])
勾选后重新编译生成zImage。
【问题1解决】
内核支持PCI,只不过光盘给的烧写文件有问题,其中,zImage需要换成最新的OK6410-B的烧写文件,网址如下:
http://pan.baidu.com/share/link?shareid=1595880558&uk=2754759285#dir/path=%2F%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83%E8%B5%84%E6%96%99%E5%85%89%E7%9B%98%E6%96%87%E4%BB%B6%2FOK6410-B%20%206410%E5%AE%98%E6%96%B9%E5%9F%BA%E7%A1%80%E8%B5%84%E6%96%99-1G%2FLinux-3.0.1%2Ffilesystem
效果是输入
#testcamera,LCD有显示,不过LCD效果很不好。
LCD显示效果:
LCD上部即为摄像头的图像,QT里的测试程序没有编写好,不过至少摄像头能用了。
开发环境:
主机:VMware+ubuntu
FS:nfs
nfs的配置过程及注意事项见:
http://blog.csdn.net/jason6765599/article/details/19759689
步骤1基本完成,继续步骤2的工作
步骤2
想复杂了,在开发板端构建web服务器没有什么意义,想要外网能够访问,就必须借助于具有外网IP与内网IP的设备,在开发板上搭建web服务器只能够自娱自乐一下。将摄像头采集的头像发布到类似yeelink的平台上,其实只需要将图像打包,然后调用平台的API即可,所以说这一步看似必要,其实是鸡肋,另外motion获取图像并且发送邮件,这个扩展功能能够实现真是极好的了,好了,可以洗洗睡觉了,可惜宿舍停水,热水脚都没得洗,悲催。
开发板通过网络上传图像的基本步骤是:
开发板----wget----->图像-------curl-------->POST至Yeelink平台
主机中,通过VMware建立了ubuntu系统,在ubuntu下测试使用crul来向yeelink平台上传一幅位于ubuntu下的图像。
1.进入yeelink平台,建立设备PostImageTestDevice,建立图像型传感器ImageTest,建立ImageTest后会生成CURL可以使用的网址:
定义CURL命令格式:
参看
请求实例 (运用curl):
curl --request POST --data-binary @datafile.jpg --header "U-ApiKey: YOUR_API_KEY_HERE" http://api.yeelink.net/v1.0/device/12/sensor/3/photos
需要在HTTP Header中增加API Key来授权写入操作, 具体请参照API Key. 支持一次传送一幅图像数据.
Note: 目前限定相邻图像数据上传间隔须大于等于10s, 过于频繁的请求会收到406 Response.
参照API的文档,定义上传VMWAREubuntu下/monitor/hero.jpg文件至yeelink平台,新建上传命令文件:/monitor/curl-test,主要参数为:上传图片、数据格式、U-ApiKey、传感器网址。
curl --request POST --data-binary @/monitor/hero.jpg --header "U-ApiKey: YOUR_API_KEY_HERE" http://api.yeelink.net/v1.0/device/7811/sensor/12369/photos
在ubuntu安装CURL:
#apt-get install curl
运行curl-test
#./curl-test
效果:
nice!
下面考虑的是如何获得传感器的图像
2014-02-24
今天弄了一天,飞凌OV9650摄像头通用性不好,本以为只是LCD显示问题,但是自带的测试程序的将VGA转存为jpg文件的函数并不能够通过编译,此路不通咱们换一条路,准备走安装mjpg-STRAMER的老路,可是当mjpg-STREAMER安装上后,根本不能够利用摄像头通过web服务器发布图像,在此估计是摄像头的通用性能不好,毕竟不是USB的,还是MARK一下,制作OK6410兼容的mjpg-STREAMER的方法,详情请猛点如下网址:
http://blog.csdn.net/jason6765599/article/details/19838621
2014-02-25
还是放弃原来的的OV9650,向同学借了一个摄像头,发现能用,那怎么才能知道摄像头是符合UVC标准,还有测试摄像头呢?
请猛戳如下网址:
http://blog.csdn.net/jason6765599/article/details/19907263
摄像头能用,本来luvcview支持两种格式的显示1.jpg格式2.yuv格式,此摄像头只支持yuv格式,这就导致了mjpeg-STREAMER不能用了,土办法,首先使用摄像头拍照,yuv格式拍照的照片格式为*.pnm,然后使用图片格式工具netpbm将pnm格式图片转换为jpg格式,当然这一部分是在ubuntu下操作的啦。
1.可以使用在资料光盘中的路径为:Linux-3.0.1\apptest\摄像头测试\USB摄像头\USBCamera- linux+android\linux3.0.1系统下-2012-07-05/luvcview-2012-07-05.tar,源码默认是不能够拍照的,但是具有拍照功能,修改源码luvcview.c中:
在 if (videoIn->getPict) 前添加代码
videoIn->getPict=1;
代表使能拍照功能,重新编译后,将执行文件luvcview拷贝至开发板的根目录下,然后执行:
# ./luvcview -d /dev/video2 -f yuv
开发板将拍的照片存放至与luvcview同样的目录路径下,也就是根目录下,扩展名为.pnm
2.问题在于yeelink平台并不支持pnm格式的图片,因此需要转换,暂时开发板上是搞不定了的,只能依靠强大的ubuntu了,百度了一下,发现一款图片转换工具netpbm,能够将pnm等多种图片格式转换为jpg,在主机上安装netpbm:
#sudo apt-get install netpbm
转换图片,命令格式为:
#pnmtojpeg -quality=60 foo.ppm > foo.jpg
命令可以参考
http://netpbm.sourceforge.net/doc/pnmtojpeg.html
3.然后使用主机ubuntu中的CURL工具上传至yeelink平台。
这一套是成功了,但是问题是开发板对于主机的依赖太大,图片转换和上传图片都是ubuntu完成的,OK6410完成的仅仅是驱动摄像头,然后拍照。
在OK6410需要完善的工作是:
1.搭建类似CURL能够HTTP-POST数据的工具;
2.得到jpg格式的图片,要么换摄像头,要么移植图片转换工具。
今天的效果如下:
后面要做的工作是:
1.测试摄像头是否合格,使用命令:
#luvcview -L -d /dev/video2
# luvcview -d /dev/video2 -f jpg -s 320x240
2.mjpeg-STREAMER能顾正常使用:
#mjpg_streamer -i "/mjpeg/input_uvc.so -d /dev/video2" -o "/mjpeg/output_http.so"
用火狐浏览器打开一个网页输入下面地址就能够看到一个视频(开发板的IP为192.168.1.100):
http://192.168.1.100:8080/?action=stream
打开一个网页输入下面地址就能够看到一个静态图片:
http://192.168.1.100:8080/?action=snapshot
3.更新wget命令或者安装CURL命令
4.上传图片
突然想起来,那个mjpeg-TREAMER的库的名字就叫做:input_uvc.so,怎么可能不能够输入yuv模式的图片,然后想了一下,报错是由于ERROR: could not find input plugin,也就是找不到入口,应该就是入口库,然后试着把所有的库拷贝至/usr/lib,然后再使用命令:
# mjpg_streamer -i "input_uvc.so -y -f 15 -r 320*240 -q 50 -d /dev/video2" -o "output_http.so -p 8080 -w /www/camwww"
然后就可以了啊!用火狐浏览器打开,效果如下:
好了,上句命令参考了:
http://hi.baidu.com/xhk7777/item/35a1afb553dc6ae84fc7fd33
不过主要原因还是库找不到,需要拷贝至指定文件夹下。
好了,OK6410开发板通过摄像头,利用mjpeg-STREAMER搭建网页视频流,并且利用wget工具截取视频为图片一条龙服务搭建完成,通过执行脚本文件getimage.sh,即可完成全套动作:
#! /bin/sh
mjpg_streamer -i "input_uvc.so -y -f 15 -r 320*240 -q 50 -d /dev/video2" -o "output_http.so -p 8080 -w /www/camwww" &
wget "http://192.168.1.100:8080/?action=snapshot" -O /test.jpg
注意第一句的&,此符号代表在后台执行程序,第二句表示将视频流截取为test.pg的图片,整套系统的基本版剩下的任务是通过利用类似CURL的服务将图片文件传输至yeelink。
今天基本上完工了,晚上将curl安装至NFS下,nice。
首先需要交叉编译,然后安装,具体的编译方法可以猛戳如下连接:
http://blog.csdn.net/jason6765599/article/details/19927041
安装好curl后就只需要POST-DATA了,在开发板中输入如下命令:
curl --request POST --data-binary @/hero.jpg --header "U-ApiKey: YOUR_KEY" http://api.yeelink.net/v1.0/device/7811/sensor/12369/photos
就会出现如下惊喜的结果:
接下来只需要将以上内容整合,优化上传图片了,NICE,man!
2014-02-27
接下来写shell脚本文件了,将下载图片与上传图片的功能写入update shell中,并且向crontab添加计划任务,每格一定的时间wget image,并且curl图片之yeelink平台.
1.首先需要测试crontab任务,主要添加的是:每隔一定时间,执行一次update,具体配置busybox下crontab任务,参见下文,请猛戳如下网址:
http://blog.csdn.net/jason6765599/article/details/20045583
2.编写shell脚本.
2.1首先判断mjpeg-STREAMER是否已经启动,若未启动,则执行启动命令,若启动完成,则继续执行2.2;
2.2判断是否执行成功,成功则执行2.3,失败则退出;
2.3使用wget命令得到image.jpg文件,若成功,则继续2.4,若失败则退出;
2.4使用curl命令将图片POST至yeelink平台,成功与失败均推出程序。
所有的执行结果均记录如updatelog日志文件。
今天初步完成了基本功能,逻辑判断内容还没有添加,有待完善,看到自己摄像头拍摄的图片在yeelink上成功显示,真是倍儿爽啊!