本文主要是介绍mini2440基于motion的移动图像监控系统和基于SDL的远程监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这段时间在考虑做基于mini2440移动图像监控系统设计和远程监控设计;这个项目刚开始被我分割成几部分:
1.实现采集开发板上摄像头数据在开发板的LCD显示
2.实现网络远程监控把开发板上摄像头数据发送到PC并在PC机上显示
3.实现网络远程监控及移动图像监控
虽说方向有了,刚开始是跟着国嵌高级项目走,不过摄像头被指定为网眼2000、上位机和资料介绍不多,让我开始卡住了;所以只能在网上找其他资料进行实现,由于刚开始什么都不懂,都不知道从何下手就实现了第一步;几天都一直卡死没啥进展;昨天网上突然发现了问题所在,有点进展了,因此开始我这次项目的记录及总结;
1.实现采集开发板上摄像头数据在开发板的LCD显示
内核编译什么的就没得说了,至少得编译一个LCD能正常正作、支持V4L2和摄像头万能驱动的内核,配置资料网上大把,开发板上搭建好linux环境;市面上的摄像头输出格式有MPEG和YUV两种,好的摄像头能同时支持MPEG和YUV,中芯微ZC301摄像头只支持MPEG;虽说两种格式的摄像头都有,这里我是使用YUV格式的摄像头;需注意的是摄像头采集到的数据时yuv422数据而mini2440LCD显示格式为RGB16,数据转化流程为yuv422>>RGB24>>RGB16;
V4L2程序架构程序我是参考了“草根老师博客(程姚根)”的程序,程序里边注释不多,看的同时也得在网上查阅有关资料才能弄明白;
V4L2编程参考程序: http://blog.chinaunix.net/uid-26833883-id-3249346.html
本人修改后的程序:http://download.csdn.net/detail/u010245383/8105397
错误分析:开发板连接摄像头时出现,可能USB时钟频率原因
修正参考:http://cgsz1992.blog.163.com/blog/static/1797050602012421048701/
第一步就到此实现了,接下来卡壳了;很多东西不知道该怎么做,而网上资料最多的是“ 基于v4l2 ffmpeg x264的视频远程监控”,这种方案是用的V4L2的视频驱动,然后配合ffmpeg、x264的软件编编码成H.264,再头通过网络传输到PC机上显示;自己在编译ffmpeg-1.0.tar.bz2时就出现找不到X264.H的问题,而卡死在这;最后参考了网友mashang123456789 :http://blog.csdn.net/mashang123456789/article/details/8673426 成功编译了ffmpeg;第二步目前到此,不知道怎么把数据编码成H264;
motion的移植和使用
由于第二部卡死的缘故,使得我想先直接在开发板上实现移动图像监控,知道有motion这个东西,开始寻找这个算法,由于能力有限最终不知道怎么使用并移植这个算法(本人那时候不知道motion怎么使用的,使用在开发板还是PC机),通过了解和摸索,才知道motion是一个软件,它可以直接打开摄像头,获取摄像头数据并分析处理,数据有变化时可以相应的把数据保存为jpg格式的照片并输出到指定目录,这时候直接才恍然大悟;
motion的移植和使用时参考网友mashang12345678实现的
网址:http://blog.csdn.net/kangear/article/details/8763790
期间也出现了些问题:在运行motion时出现 motion-/bin/sh: ./motion : Input/output error 在移植ffmpeg时也是如此;网上找资料,折腾了很久也没能解决,偶然一次发现了问题所在,自己编译一个小程序,执行后也是出现Input/output error这种错误,最后才发现是少加了-static,很明显就是动态链接库的原因,以前实验的程序基本都是采用静态链接的方式所以没发觉;建立动态链接库直接从交叉编译器的库文件目录中拷贝过来:
#cp -f /usr/local/arm/4.4.3/arm-none-linux-gneabi/libc/armv4t/lib/*so* lib/ -a
对于"lib"目录:这个里面放的都是库文件;
再次运行motion又出现缺少 libjpeg.so.62 直接拷贝国嵌高级项目SDK中的文件,又出现libjpeg.so.62 太短错误;最终重新编译libjpeg.so.62解决错误;
参考网友monahans编译出libjpeg.so.62 网址:http://blog.csdn.net/monahans/article/details/3042604
其中重新下载新版本的libtool以默认方式安装这部分有点小瑕疵,我更正下:
解压完libtool-1.5.26.tar.gz 后进入工作目录
先执行:export CC=gcc //指定编译器
再执行:export prefix=/XX //工作目录为jpeg库的工作目录 , 把libtool安装到jpeg工作目录,jpeg库才能成功编译通过
然后:make
再:make install
继续编译JPEG库的编译工作,编译完成后把lib下的
拷贝到开发板文件系统 /lib目录下 运行motion 能正常工作了 到此motion移植完成
motion配置文件参考:http://download.csdn.net/detail/u010245383/8105463
革命尚未成功还需继续努力,继续战斗
由于前边是一直想用H264实现传输的,不过摄像头格式是YUV的,数据量比较大,有个严重的缺陷,就是S3C2440芯片USB接口是1.0的虽说兼容2.0,但最高速度也就10M Bit/S(1.25MB/S),实际上也就只有800几KB/S,速度远远不够1秒钟也就能传输1-2帧数据,因此会特别的卡;于是我就放弃了使用YUV格式的摄像头,转而使用JPEG格式的摄像头,数据被压缩成JPEG大大减少数据量;在网上了解到SDL可以显示BMP格式的图片,再移植SDL_image库就可以支持JPEG、PNG,GIF等格式,JPEG格式的摄像头可以把数据存储为.jpg格式的照片,就可以把数据发到PC机上,在PC机上实现播放;一步一步的实现我的想法;最后终于实现远程监控,效果还不错采集640X480分辨率有点延时,但不卡很流畅,都能看到室友浏览网页切换的画面,320X240分辨率延时性问题降得很小,也是很流畅;
jpg图片显示程序是参考了网友 九天雁翎 的程序 http://blog.csdn.net/vagrxie/article/details/5735979
参考网友:绝_影 linux下安装SDL http://blog.csdn.net/lzx_322/article/details/8307558
chinabinlang SDL库的安装及游戏测试 http://blog.csdn.net/chinabinlang/article/details/8060139
SDL入门学习教程 http://www.linuxidc.com/Linux/2012-12/75255.htm
侄狂侄殇侄颠 http://blog.sina.com.cn/s/blog_9c8c371101016ibh.html
本人源代码 :http://download.csdn.net/detail/u010245383/8116589
值得注意的是如果使用了SDL_image库 编译命令要加上 -lSDC_image ( l的大写是L,不是i的大写哦)
在编译完成,运行时出现./test2: error while loading shared libraries: libSDL_image-1.2.so.0: cannot open shared object file: No such file or directory
提示没有找到libSDL_image-1.2.so.0 我就在window搜索下,找不到这个库文件于是想重新再编译,在make uninstall之后的信息里居然出现了libSDL_image-1.2.so.0字样,我就重新make install 再把文件拷贝到/usr/lib目录下;再运行程序,可以运行了;
make uninstall之后的信息 :
[root@chenjinpeng SDL_image-1.2.10]# make uninstall
/bin/sh ./libtool --mode=uninstall rm -f '/usr/local/lib/libSDL_image.la'
libtool: uninstall: rm -f /usr/local/lib/libSDL_image.la /usr/local/lib/libSDL_image-1.2.so.0.8.2 /usr/local/lib/libSDL_image-1.2.so.0 /usr/local/lib/libSDL_image.so /usr/local/lib/libSDL_image.a
( cd '/usr/local/include/SDL' && rm -f SDL_image.h )
( cd '/usr/local/lib/pkgconfig' && rm -f SDL_image.pc )
[root@chenjinpeng SDL_image-1.2.10]# make install
make[1]: Entering directory `/opt/SDL_image-1.2.10'
test -z "/usr/local/lib" || /bin/mkdir -p "/usr/local/lib"
/bin/sh ./libtool --mode=install /usr/bin/install -c libSDL_image.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libSDL_image-1.2.so.0.8.2 /usr/local/lib/libSDL_image-1.2.so.0.8.2
libtool: install: (cd /usr/local/lib && { ln -s -f libSDL_image-1.2.so.0.8.2 libSDL_image-1.2.so.0 || { rm -f libSDL_image-1.2.so.0 && ln -s libSDL_image-1.2.so.0.8.2 libSDL_image-1.2.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libSDL_image-1.2.so.0.8.2 libSDL_image.so || { rm -f libSDL_image.so && ln -s libSDL_image-1.2.so.0.8.2 libSDL_image.so; }; })
libtool: install: /usr/bin/install -c .libs/libSDL_image.lai /usr/local/lib/libSDL_image.la
libtool: install: /usr/bin/install -c .libs/libSDL_image.a /usr/local/lib/libSDL_image.a
libtool: install: chmod 644 /usr/local/lib/libSDL_image.a
libtool: install: ranlib /usr/local/lib/libSDL_image.a
libtool: finish: PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/local/arm/4.3.2/bin:/root/bin:/usr/local/arm/4.3.2/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
test -z "/usr/local/include/SDL" || /bin/mkdir -p "/usr/local/include/SDL"
/usr/bin/install -c -m 644 SDL_image.h '/usr/local/include/SDL'
test -z "/usr/local/lib/pkgconfig" || /bin/mkdir -p "/usr/local/lib/pkgconfig"
/usr/bin/install -c -m 644 SDL_image.pc '/usr/local/lib/pkgconfig'
make[1]: Leaving directory `/opt/SDL_image-1.2.10'
这篇关于mini2440基于motion的移动图像监控系统和基于SDL的远程监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!