《嵌入式课设报告w.docx》由会员分享,可在线阅读,更多相关《嵌入式课设报告w.docx(24页珍藏版)》请在课桌文档上搜索。
1、HubeiAutomotiveIndustriseInstitute实训说明书课程名称嵌入式系统课程设计设计题目基于Qt的视频实时显示设计班号专业计算机科学与技术学号学生姓名指导教师(签字)起至日期组收年9月7日2015年9月30日一目的与要求31.1 课设目的31.2 任务概要313基本要求31.3 的内容32.1 设计原理32.1.1 video41inux简介42.1.2 Video41inux下视频编程的流程42.2 设计步骤4三总体方案设计43.1 系统功能描述43.2 开发工具及开发环境53.3 基本原理53.3.1 摄像功能53.3.2 图片处理5四功能实现64.1 摄像功能64
2、.1.1 类定义64.1.2 函数定义64.2 图片处理9五测试与调试125.1 整体性能测试125.2 各功能测试125.2.1 拍照135.2.2 图片处理功能14总结与体会15参考文献15-目的与要求通过本课程设计,提高学生的分析问题、解决问题的能力,巩固嵌入式系统的基本理论知识,进一步了解和掌握课程中所讲授的概念、方法。同时通过本课程设计,全面综合应用所学过的基础知识,建立一个完整的嵌入式系统的开发过程的概念,并掌握其中的主要原理和方法。1.1 课设目的本课程设计的目的是通过开发一个摄像头的驱动程序,使学生了解嵌入式产品开发的主要步骤,包括驱动程序的设计,从而培养学生独立完成比较复杂的
3、实际系统设计的能力。1.2 任务概要熟悉V41.2相关概念及编程方法;熟悉使用Qt与V41.2结合编程方法。使用QT与V41.2结合编程来开发一个摄像头的驱动实现视频实时显示功能,并实现相应的图形处理功能。1.3 基本要求(1)完成摄像头驱动,实现视频的实时显示功能;(2)截取视频中的一帧,并对其进行任意图像变换,可选择放大、缩小、扭曲、旋转、灰度化、二值化、均值滤波、中值滤波、频域变换和直方图分析等。二设计的内容2.1 设计原理2.1.1 VideO41inux简介Video41inux(简称V41.),是IinUX中关于视频设备的内核驱动,现在已有Video4linux2,还未加入IinU
4、X内核,使用需自己下载补丁。在1.inUX中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在dev/videoO下。2.1.2 VideO41inux下视频编程的流程 打开视频设备: 读取设备信息 更改设备当前设置(没必要的话可以不做) 进行视频采集,两种方法:(1)内存映射(2)直接从设备读取 对采集的视频进行处理 关闭视频设备。2. 2设计步骤(1)在实验箱上接入罗技C270摄像头。(2)将Camera.tar.gz解压至U/OPtzFriendIyARMexpqt下。(3)分析VideOdeViCe.叩P和VideOdeViCe.h学习使用C+封装V41.2驱动的方法。
5、分析PrOCeSSlmage.cpp中使用V41.2进行动态图像显示的方法。(5)进行任意图像变换,可选择拉伸、收缩、扭曲、旋转、灰度化、二值化、均值滤波、中值滤波、频域变换和直方图分析。三总体方案设计3.1系统功能描述本系统采用QT与V41.2结合编程方法,实现的主要功能有:(1)用外接的USB摄像设备来采取实时图像,并将其显示在开发板的1.ED屏幕上。(2)通过点击1.ED屏幕来完成拍照,截取一帧图片,并显示照片。(3)对照片或者默认图片进行处理,即放大、缩小、旋转、扭曲、灰度化等。3. 2开发工具及开发环境(1)计算机环境:XP系统,VM8.0,1.inux系统(虚拟机)。(2)试验箱环
6、境:DYV-I型嵌入式车载多媒体试验箱。(3)其他工具:串口线(连接PC机与试验箱),摄像头(USB接口)。(4)相关资料:摄像头驱动程序代码(Camera.targz)。3. 3基本原理1 .3.1摄像功能帧率:每秒从视频设备中读取的次数,可以自行调整。分辨率:图像像素分布的密集程度,本系统中的分辨率初始值设置为320*240。拍照:从保存视频的缓存区中取出一帧,并将其显示并保存文件格式。本系统中的图片格式为*JPG。3 .3.2图片处理(1)放大:将图片的宽和高同比放大任意倍数。将像素对应的灰度值放在原坐标系乘以放大系数得到的新坐标系中,从而实现图片的放大。图片的放大系数越大,得到的放大图
7、像越大,相应的新图像单位面积内的像素点就少,所以图像放大的越大,图像越模糊。(2)缩小:将图片的宽和高同比缩小任意倍数。将像素对应的灰度值放在原坐标系除以缩小系数得到的新坐标系中,从而实现图片的缩小。图片的缩小系数越大,得到的缩小图像越小,相应的新图像单位面积内的像素点就多,所以图像缩小的越小,图像越清楚。(3)旋转:将图片往规定方向旋转任意角度。图像的旋转过程中坐标系的变换:输出坐标系一数学坐标系一旋转一输出坐标系。(4)灰度化:图像上的像素都是有RGB3位整形数据组成的灰度值。RGB分别对应色光三原色中的红绿蓝,每种颜色的范围都是0255。如果图像的R、G、B都为0,则图像只有单一的黑色,
8、如果图像的R、G、B都是255,则图像只有单一的白色,如果图像中的每一个像素都有R=G=B,则图像就是灰色的,也就是我们要得到的灰度化图像。因此,图像的灰度化只要处理图像使其R=G=B即可。(5)二值图像是指每个像素不是黑就是白,其灰度值没有中间过渡的图像。二值图像一般用来描述文字或者图形,其优点是占用空间少,缺点是,当表示人物,风景的图像时,二值图像只能描述其轮廓,不能描述细节。这时候要用更高的灰度级。(6)边缘:图像增强处理的一种。它是将遥感图像(或影像)相邻像元(或区域)的亮度值(或色调)相差较大的边缘(即影像色调突变或地物类型的边界线)处加以突出强调的技术方法。经边缘增强后的图像能更清
9、晰地显示出不同的物类型或现象的边界,或线形影像的行迹,以便于不同的物类型的识别及其分布范围的圈定。1.s-x:将图像横向放大(8)1.s-y将图像纵向放大(9)直方均衡化变换:设灰度变换s=f(r)为斜率有限的非减连续可微函数,它将输入图象Ii(x,y)转换为输出图象Io(x,y),输入图象的直方图为Hi(Ir),输出图象的直方图为Ho(三),则根据直方图的含义,经过灰度变换后对应的小面积元相等:Ho(三)ds=Hi(r)dr四功能实现4.1 摄像功能4.1.1classVideoDeviceipublicQObjectQjDBJECTpublic:VideoDevice(QStringdev
10、_name);初始化视频设备intOPen_device();打开设备intCIOSe_device();关闭设备intinit_device();载入设备的参数信息int3tart_capturing();开始捕获图像intStOP_capturing();停止捕获intUninit_device();/卸载设备intget_frame(void*,size*);/获取帧intUnge1.frame();停止获取private:intinitjnmap();将信息写入内存空间structbuffer/定义缓存空间(void*start;size_tlength;);QStringdev_na
11、me;intfd;buffer*buffers;unsignedintn_buffers;intindex;signals:voiddisplay_error(QString);4.1.2函数定义#include#include,processlmage.h,#include,videodevice.h11#includeui_processlmage.hextemCnIinclude#includeProcessimage:ProcessImage(QWidget*parent):QWidget(parent)加载驱动Pp(unsignedChar*)malloc(320240/*QWidg
12、et:width()*QWidget:height()*/*3*sizeof(char);painter=newQPainter(this);/捕捉视频画面frame=newQImage(pp,320,240,QImage:Format_RGB888)/frame=newQPixmap(320,320);connect(vd,SIGNA1.(display-error(QString),this,S1.OT(display_error(QString);/将信号与S1.OT连接rs=vd-open-device();if(-l=rs)tQMessageBox:warning(this,tr(,
13、error,),tr(11opendevdsperror),QMessageBox:Yes);vd-close_device();)rs=vd-init-device();if(-l=rs)(QMessageBox:warning(this,tr(error),tr(initfailed,1),QMessageBox:Yes);/显示提示错误信息框vd-close-device();rs=vd-start-capturing();if(-l=rs)(QMessageBox:waming(this,tr(error),tr(startcapturefailed),QMessageBox:Yes)
14、;vd-close-device();8if(-l=rs)QMessageBoxwaming(this,tr(,error,),tr(,getftamefailed),QMessageBox:Yes);vd-stop_capturing();timer=newQTimer(this);connect(timer,SIGNA1.(timeout(),this,S1.OT(update()window-show();Processimage:ProcessImageO/析构函数(rs=vd-stop_capturing();rs=vd-uninit_device();rs=vd-close_dev
15、ice();4.2 图片处理(1)拍照voidProcessimage:paizhao()beishu=1.0;seita=O;rs=vd-get_frame(void*)&p,&len);convertyuvtorgbbuffer(p,pp,320,240);/从视频的缓存区中提取一帧frame-loadFromData(uchar*)pp*len*320*240*3*sizeof(char);/将提取的帧提取为Qimage形式并放在指定的空间中frame-save(123.jpg);/保存所拍的照片img-load123.jpg);/将图片保存为*.jpg格式label1-setPixma
16、p(QPixmap:fromImage(*frame,Qt:AutoColor)labell-show();rs=vd-unget_frame();(2)放大voidProcessimage:fangda()可有两种方法实现,注释掉的部分为对图片矩阵操作的方法。/*w=image.width();/获取图片尺寸h=image.height();doublex,y,rl,r2,gl,g2,bl,b2;inti,j;QRgbrgb,rgbl,rgb10,rgb11;i11tr,g,b;beishu=beishu*1.2;SoUlmage=Qlmage(W,h,QImage:Format_RGB88
17、8);Soulmage=Qlmage(int)w*beishu,(int)h*beishu,QImage:Format_ARGB32)for(i=0;iw*beishu;i+)(for(j=0;jresize(Sou!mage.width(),Soulmage.height();ui.label2-setPixmap(QPixmap:fromImage(SouImage);QPainterpainter(this);QPixmappix;pix.load(imageslinux.jpg);painter.drawPixmap(O,0,1OO,100,pix);qrealwidth=pix.wi
18、dth。;获得以前图片的宽和高qrealheight=pix.height();pix=pix.scaled(width*2,height*2,Qt:KeepAspectRatio);将图片的宽和高都扩大两倍,并且在给定的矩形内保持宽高的比值painter.drawPixmap(100,1OO,pix);以下为调用系统图片处理函数的方法。beishu=beishu+0.2;QImage*imgl=newQImage();*imgl=img-scaled(320*beishu,240*beishu,QtrrKeepAspectRatio);labell-setPixmap(QPixmap:fro
19、mImage(*imgl,Qt:AutoColor)(3)缩小voidProcessimage:suoxiao()if(beishu=0.4)(beishu=beishu-0.2;)QImage*imgl=newQImage();*imgl=img-scaled(320*beishu,2405fcbeishu,QtiiKeepAspectRatio);labell-setPixmap(QPixmap:fromlmage(*imgl,Qt:AutoColor);(4)旋转voidProcessimage:xuanzhuan()同放大缩小一样有两种方法实现,注释掉的部分为对图片矩阵操作的方法。/*
20、i11ti,j;w=image.width();/获取图片尺寸h=image.height();intwnew=320,hnew=240;doublex,y,xl,yl;定义坐标变量,x,y为原坐标,xl,yl为新坐标seita+=90;/定义旋转角度senta=3.14159/180*seita;/度数转化为弧度数QRgbrgbOO;/返回值为整形的灰度值intrl=O,gl=O,bl=O;/灰度值Soulmage=QImage(w,h,QImage:Format_RGB888);/初始化新图片for(i=0;i=O&ceiI(x1)=0&ceil(yl)resize(Soulmage.wi
21、dth(),SouImage.height();ui.label2-setPixmap(QPixmap:fromlmage(SouImage);/显示图片*/以下为调用系统图片处理函数的方法。if(seita=-90)seita=270;QImage*img2=newQImage();QMatrixmix;mix.rotate(seita);*img2=img-transfonned(mix);label1-setPixmap(QPixmap:fromImage(*img2,Qt:AutoColor)seita-=90;(5)灰度化voidProcesslmage:huidu()QImage*
22、img3=newQImage();*img3=img-convertToFormat(QImage:FOrmaundeXed8)img3-setColorCount(256);for(inti=0;isetColor(i,qRgb(i,i,i);labell-setPixmap(QPixmap:fromImage(*img3,Qt:AutoColor)(6)拉伸voidProcessimage:lashen_x()QImage*imgl=newQImage()*imgl=img-scaled(320*1.4,240,Qt:IlgnoreAspectRatio,Qt:ISmoothTransfo
23、rmation);label1-setPixmap(QPixmap:fromlmage(*img1,Qt:AutoColor);voidProcessimage:lashen_y()QImage*imgl=newQImage();*imgl=img-scaled(320,240*1.4,Qt:IlgnoreAspectRatio,QciSmoothTransformation);labell-setPixmap(QPixmap:fromImage(*imgl,Qt:AutoColor);宜方voidPrOCeSSlmage二Zhifang()QImageimage!;imagel=QImage
24、(,123.jpg);QImageImageAverage;ImageAverage=QImage(320,240,QImage:Format_RGB888);intw,h;QRgbrgb;intr255,g255,b255;/副憎混Jg劫釜蹲板害镰伴嘶勤牌理?intrtmp,gtmp,btmp,rj,gj,;floatrPro255,gPro255,bPro255;/到憎混金易勘釜鳞板害绡X貌姒徭昆floatITemP255,gTemp255,bTemp255;黄)囱金表槐悦Jg勤釜蹲板害第X碗姒徭昆intrJun255,gJun255,bJun255;金句囱金表槐悦漠瑰解踱快础劭E?mem
25、set(r,(),sizeof(r);memset(g,0,sizeof(g);memset(b,0,sizeof(b);整峰悯剑增混劫釜蹲板害勤瞪Kl?for(w=0;w320;w+)for(h=0;h240;h+)rgb=imagel.pixel(w,h);rqRed(rgb)+;gqGreen(rgb)l+;bqBlue(rgb)+;整峰虢剃憎混勤釜鳞极害维X硫姒徭昆for(w=0;w=255;w+)rProw=(rw*1.0)/(320*240)gProlw=(gw*1.0)/(320*240)bProw=(bw*l.0)/(320*240);/掏囱槐悦S三劲釜醇板害组X貌姒僵昆镑崎悦
26、镶惰嫁鎏槐敝琛”赛底塞游馁徜疙硫镰?fbr(w=0;w=255;w+)if(w=0)(rTemp0=rProogTemp0=gPro0bTemp0=bPro0;else(rTemplw=rTempw-lrProw;gTempw=gTempw-l+gProw:bTempw=bTempw-l+bProw;rJunw=(int)(255*rTempw+0.5)gJunw=(int)(255*gTempw+0.5)bJunw=(int)(255*bTempw+0.5);for(w=0;w320;w+)for(h=0;hsetPixmap(QPixmap:fromlmage(ImageAverage);
27、二值化voidProcesslmageiiconvertToBinaryOQImageimage;image=QImage(l23.jpg).scaled(320,240);intw,h;w=image.width();h=image.height();QImagebinaryImage(w,h.QImage:Format_RGB32);for(inti=O;iw;i+)for(intj=O;j127)Z然后按某一阀值进行二值化rgb=255;elsergb=0;QRgbnewPixel=qRgb(rgb,rgb,rgb);binarylmage.setPixel(ij,newPixel);/
28、binarylmage.save(binaryFile);/ui.gray1.abel-setPixmap(QPixmap(binaryFile);labell-setPixmap(QPixmap:fromlmage(binaryImage);边缘voidProcessimage:bianyuan()(Qlmageimage;image=QImage(123.jpg,).scaled(320,240);intw,h;w=image.width();h=image.height();intbianyuanRgb;fr(inti=l;iw-l;i+)for(intj=l;j127)bianyuan
29、Rgb=255;else(bianyuanRgb=O;QRgbnewPixel=qRgb(bianyuanRgb,bianyuanRgb,bianyuanRgb)bianyuanImage.setPixel(ij,newPixel);Iabe11-setPixmap(QPixmap:fromlmage(bianyuanlmage)五测试与调试5.1整体性能测试系统运行良好,运行过程中没有出现意外退出和程序中断等其他BUi能够正常的运行各功能模块及显示其效果。同时,该系统的所有界面都能正常的显示,所有按钮也能使用。5.2各功能测试5.2.1拍照(1)系统运行结果界面显示,如图5.2-1。拍照功能
30、正常实现,能正常完成拍照与保存图片的功能。图5.2-15.2.2图片例理功能(1)图片放大缩小功能的实现,如图5.2-1原图,图5.2-2缩小后的图,图5.2-3放大后的图。图5.2-2图5.2-3(2)旋转旋转功能正常实现,5.2-5旋转后的图片。图5.2-4(3)图片边缘化功能的实现,5.2-5图52-5(4)图片灰度化的实现,5.2-6图5.2-6图片直方的变化,5.2-7图5.2-7图像二值化的变化,5.2-8图528(7)6X的变化,5.2T图5.2-9(8)1.S-Y的变化,5.2-10图5210六总结与体会本学期为期五周的嵌入式课程设计在不知不觉中结束了,感觉自己收获很多,学习目
31、标更加明确,学习方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件开发及学习上的一些不足之处。此次课程设计课题项目是qt视频实时显示实验。我们两人一组共同完成。虽说一些相关知识我们在课堂上也曾学习过,但是大多停留在理论学习上,实际开发很少,而这次课程设计给了我们一个很好的边学习边实践的机会,对我们深入学习这些技术有很大帮助,深刻体会到了这些技术的实用性。每当自己成功调试一段代码或者通过自己的努力克服一个技术困难,都颇有收获感。这次实训让我体验了软件开发的全过程,发现自己的不足,了解了当前流行技术的软件开发,增加了一定的项目开发经验,增强了一定的就业竞争力。实训的第一天上午,我们
32、先明确了这次课程设计的要求和目的,然后黄老师和吴老师给我们详细的讲解了我们要做什么,接下来的几周我们开始钻研摄像头驱动的开发,我们首先从基本的1.inUX命令学起,以及IinUX底下的C语言的一些基本知识。虽说上学期我们也学过1.inUX开发技术,有一定的基础,但这几天的学习,还是感觉到我们学的太浅,很多的东西需要去深入的学习才能有所收获。而且深刻的体会到“熟能生巧”这句良训,然后又学习了1.inUX底下一些开发工具的使用,如Qt,感觉这些工具功能确实够强大。当通过自己写的代码能够控制摄像头拍照时,别提有多高兴了。当然在调试的过程中也遇到不少错误,每当通过自己的努力把问题解决的时候,就会特别自
33、豪。还有一个比较深刻的体会就是APl及一些文档的查阅,这对开发人员来说是一个必须具备的能力。通过几周的实训,我明白在计算机这个博大深奥的领域还有好多东西要学,还有好多的东西不懂,嵌入式软件开发应用广泛而且前景很好,目前正处于人才紧缺的关口,嵌入式技术在未来能够得到更加广泛的应用。这次的课程设计让我明确了一点:嵌入式开发对于提升我们的系统知识有很大的帮助,尤其是操作系统的知识。嵌入式系统开发对于我们的知识面要求非常的广,且要有一定的深度。这次的课程设计因为是一个有针对性的训练,所以记的会非常牢固。跟平时上课不太一样,平时上完理论课很少有时间上机进行时间或者隔几天才上机练习,等到上机时一些东西可能
34、遗忘了,比较耗费时间。在课上,有老师在前面演示我们感觉看得懂或感觉没问题,可轮到我们独立完成的时候,因为实际操作的少,许多问题就来了!我很感谢学校特别是学院老师有实训这样的安排,把我们一学期学的东西系统的集中的进行训练,让我们深刻明确的体验了一下软件开发的流程!还要感谢给我们实训的吴老师很有耐心的指导,还给我们讲一些学习计算机的方法,一些软件开发需要注意的细节,让我们知道自己在哪方面不足,需要加强,也让我们了解到哪些需要认真的学习那些是重点,不是没有方向的乱学一通。经过这次的实训,我真真确确的感受到了计算机在我们生活中工作中的运用,这些软件、程序能让我们提高工作的效率,更直观更便捷的切入主题。
35、当然,在学习的过程中并不是一帆风顺的,在这之中,因为要操作的东西很多,有时错一步,后面的结果就无法显示,而自己的计算机水平还有待提高,根本检查不出来是哪里出了错!这时候,老师同学都会耐心的讲解。这几周实训给我的感悟:首先是心态。一定要有一个积极的心态,独立解决问题的意识,培养扎实基础的认识。其次是兴趣,感觉学习工作中兴趣很关键,有了兴趣就自觉了,效率自然就高了。再次要敢于尝试和挑战。不要安于现成的程序,而且不要害怕失败,在程序调试的过程中这点尤为重要,“发现出问题然后解决问题”是一个积累经验的过程,而且很高效。最后要不懈追求。对于源代码进行不断的完善,要尽可能的实现课题所要求的功能。对于初学者
36、或者开发较少的人来说,大量写程序还是有必要的,但同时要注意思考,理解其实现的内在意义。还可以自己添加一些有意义的功能来实现。当看到自己编写的程序正常运行时,兴趣也会随之而来,乐此不疲,形成一个良性循环。短短几周的课程设计很快结束了,我发现我对计算机这个专业、对嵌入式技术、对1.inUX都有了新的认识。通过这次的实训,我了解到,要真真正正的掌握计算机程序还不是一件简单容易的事儿,但真正掌握后,它带给我们的将是无穷的便捷与科技。我希望我能做计算机这个万能机器人的主人而不是奴隶,我会努力加油的!感谢老师给我的帮助,让我的思想、技能又上了一个台阶!七参考文献石秀民,魏洪兴.嵌入式系统原理与应用一基于XSCag1.imrC北京航空航天大学出版社,2007陈虎,吴涛.嵌入式系统课程设计.机械工业出版社,20083UP-TECHPXA27O-S(1.inux)嵌入式系统实验指导书.北京博创兴业科技有限公司.2008佚名,V41.2视频实时显示O1.,来源:CSDN论坛