mini2440基于motion的移动图像监控系统和基于SDL的远程监控

2024-05-09 21:32

本文主要是介绍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的远程监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974549

相关文章

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis