摄像头驱动程序的开发修改和移植(针对嵌入式mini2440开发板)—开发文档

时间:2022-10-12 19:03:13
 

实训报告

 

 

 

实训题目视频监控

实训目的1,理解并掌握视频监控的原理;

                          2,解读视频监控源程序,理解并掌握程序中各个数据结构的用法和作用;

修改程序使之在远程的两台pc机之间实现远程视频监控并传送图像的功能和抓图并传送图像的功能;

4,移植到mini2440开发板上使之实现开发板和pc机之间远程视频监控功能和抓图并传送图像的功能;

实训设备: mini2440开发板一个以及附属设备,带有windows xp以上系统的pc机一台windows系统下虚拟工作站并装有Ubuntu 10.4(linux_2.6.32.2的内核)操作系统。

实训内容:

        第一天自学并试读源程序

 

具体如下:

通读程序,通过对具体的流程的掌握,找出程序中的关键点,重点解读这些关键点,如:视频的采集,视频的显示和图像文件的获取以及命名规则等等。重点解读luvcview.c文件和v412uvc.c文件。熟悉和理解当中的数据结构以及作用,重点掌握vdIn数据结构中的成员的作用和用法,知道framebuffer和tmpbuffer的用法和作用以及重要性:tmpbuffer中存放的是一张图像文件,而framebuffer中存放的则是这些图像文件的集合,最终形成视频文件,切其大小为:153600个字节。

 

 

第二天在Ubuntu 10.4中在安装SDL库并且编译试运行视频监控源文luvcview_20070512;

具体操作如下:

 

首先将SDL库文件包拷到任意目录下,这里我们将此包拷到/mnt/目录下,然后解压,启动一个终端,进入到解压后得目录,然后再终端输入:./confgure运行配置文件,使之生成Makefile文件,然胡在终端输入:make编译源文件,编译完成后再在终端输入make install安装SDL库,安装完成。

其次将视频监控的源文件同样拷贝到/mnt/目录下,然后进入此目录,运行make命令,编译它,等编译完成后,插上摄像头,在终端输入./luvcview命令,运行程序,便会在屏幕上出现一个窗口,然后显示采集到的视频图像。

 

 

第三天:用TCP协议实现视频传输功能;

具体操作如下:

 

将程序拷贝成两份,一份用作服务器,一份用作客户端;在服务器端建立TCP服务器,等待客户端的连接,客户端连接成功后等待接受客户端发来的视频信息,然后调用显示函数来显示图像。在客户端连接服务器,连接成功后,先采集视频信息,然后将采集到的视频信息发送到服务器端。

具体的代码变动:在服务器端注释掉采集信息的代码,然后调用recv()函数来接受来自客户端的视频信息(framebuffer),保留显示图像视频信息的代码。在客户端先采集信息,然后调用send()函数来发送视频信息(framebuffer)到服务器端,注释掉显示图像的代码。以此实现远程传输视频信息的功能。

 

第四天:用TCP协议和QT4实现pc机之间的远程传输图像循环并显示图像的功能:

 

实现机理:在客户端利用tcp协议传送图像到服务器端,服务器端的功能是将图片保存在一个文件夹中,并且利用QT4提供的界面将图片循环显示到此界面上。

                               要求:实现最少20张图片的完整有序的传输。

                               具体实现

客户端:连接服务器,设置整形全局变量来控制发送图像(tmpbuffer)的次数,这里我们定义20次,20次传完后便停止传送,并且为了使接收端充分接收,将发送的延迟由源代码中的0.01秒调到1秒。

服务器端:建立服务器,等待客户端的连接,连接后,接收图像,将接收到的图像先存到一个大小大于传输的图片中最大比特的大小,这里我们定义的buf长度为7000,已经足够大了,然后定义一个存放图像名字的数组(20张图片得名字的长度加起来最大为100),大小为100个字节,随着循环的次数,将图片一张一张的名字从0开始到19格式化输出到name中,然后调用open函数依次创建并打开name,将每一次buf中的数据写进以此name命名的图像文件中,知道20张图像全部传送完成。

 

 

第五天将视频传输的程序移植到开发板,实现在开发板上采集图像视频,在pc机上显示的功能:

 

实现机理:将传送图像的客户端程序交叉编译成在开发板上能运行的程序这里我们只用的交叉编译工具为arm-linux-gcc-4.4.3,然后搭建nfs环境,将此可执行文件在开发板上运行用于采集视频利用tcp协议发送到pc机的服务器端来显示视频信息。

具体操作:

开发板:将开发板自带的super_vivi_128M 的bootloader和linux_2.6.32.2          的内核编译生成的zImage_x35文件以及rootfs_qtopia_qt4.img文件系统烧录到开发板上使之能支持usb摄像头。

客户端:连接服务器,发送图像视频信息(framebuffer)到服务器端,等待服务器端接收。运行于开发板上。

服务器:建立服务器,等待连接。连接成功后接收图像视频信息,然后显示。运行于pc机上。

代码修改部分:客户端的代码修改:

(1)修改Makefile文件,将编译工具改为交叉编译工具:arm-linux-gcc,将关于SDL的选项的值去掉不填。

(2)修改luvcview.c文件,将其中和SDL有关的所有代码全部删除,另外不用的代码也全部删除,客户端的功能只是采集图像,采集到图像后将图像发送到服务器端显示而已,故其他与视频采集有关的代码均可以删除。

(3)修改v4l2uvc.c文件,将其中的SDL_Delay删除。

代码的编译:打开一个终端,导入交叉编译环境,然后进入此目录,编译代码,按照提示的错误注释或修改代码。直到编译不出错。

搭建nfs环境:在虚拟机的中断输入shares-admin来创建共享目录,然后再开发板上输入mount –t nfs –o nolock,rsize=1024,wsize=1024 虚拟机的ip地址:共享文件的目录 挂接目录。以此来完成nfs环境的搭建。

在开发板上运行程序:将交叉编译好的可执行文件拷贝共享文件中,通过nfs环境将此可执行文件放到开发板上运行。

 

第六天在开发板上实现发送图片到pc机的服务器端,实现准确无误的传输图片的功能:

 

实现机理:在开发板上运行客户端采集图像,然后传送到pc机的服务器端,服务器利用QT4提供的界面来循环显示图片。

要求:至少传送20张图片,并且要实现图片大小准确无误的传送,确保接收到完整的图片,循环然后显示。

具体实现:

开发板:同第五天的实验开发板的内核以及文件系统

客户端:运行在开发板上,功能:传输图像,由于开发板和pc机之间cpu时钟频率以及其他硬件的差异,故发送的时候需要延迟,在这里我们设置为5秒,也就是每5秒发送一次。

同样用arm-linux-gcc-4,4,3的交叉编译器编译客户端,使之能在开发板上运行。

服务器端:同第四天的在pc机之间接收图像的服务器端,也是实现接收到图像并且保存到本地的文件夹中,并且利用QT4提供的界面来循环显示图像。为了保证能完全接受到客户端发来的图像,我们在循环接收的时候设置时延为5秒,这样经过实验效果很好。

 

 

总结:

此次视频监控项目使我受益良多,在理解和掌握了视频监控原理和具体操作的情况下,又使我对做项目产生了浓厚的兴趣,激发了我对学习嵌入式的热情,也更加夯实了我对基础知识的掌握,给我以后的项目开发积累了宝贵的经验,更加坚定了我对嵌入式的学习的决心。最后感谢帮助我的老师同学。

                  

 

 

 

 

 

 

 

 

                                                                                                                         曹乐平

                                                                                                                         2011.8.12   13:43 pm