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的远程监控)