已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习资料收集于网络,仅供参考西北农林科技大学信息工程学院应用软件课程设计论文 题 目: google地图中道路的识别 学 号09107002姓 名林鹤智专业班级计算机科学与技术071班指导教师宁纪锋实践日期2010年9月5日-2010年9月17日目 录一、综合训练目的与要求2二、综合训练任务2三、总体设计2四、详细设计说明3(1)配置环境3(2)生成单文档应用程序6(3)加入OpenCV库支持7(4)在Doc类中添加变量8(5)添加虚函数8(6)在View类中添加显示图像代码9(6)在Doc类中添加图像处理函数10在CSetDlg类中添加参数设置函数12五、调试与测试16(1)调试方法16(2)测试结果的分析和讨论16(3)主要问题及措施16(4)对存在问题的思考16六、实习日志17七、实习总结18八、附录:核心代码清单18学习资料一、综合训练目的与要求应用软件课程设计是计算机科学与技术专业本科生必修的一门课程,该课程是面向对象程序设计、数据结构、算法、计算机图形学、计算机网络等课程的综合应用,在整个教学体系中占据非常重要的地位。为了使本次综合训练能达到预期的效果,现具体做以下几点要求:1.要求利用软件工程思想以及模块化开发来完成系统的设计。2.要求能综合运用多个知识点的内容进行比较复杂的应用程序开发。3.小组内成员之间应合理的分工,协调工作,最终能合作完成本次综合训练的题目。二、综合训练任务我们小组本次应用软件课程设计的题目是Google地图中道路的识别,从Google地球图像中获取地理信息已经成为人们日常生活的一部分。随着技术的发展,高分辨率,高精度,多时相,多光谱的图像处理技术越来越成为受到更多人得关注。道路识别是其中一个分支。道路识别技术的应用对人们的生活和出现具有导向作用。由以上分析,我们可以充分认识到设计并开发一个google地图中道路的识别程序的必要性和迫切性,本次设计和开发得系统应利用OPENCV来实现学生信息管理,软件应该实现载入图像、显示图像、标示图像、保存图像、同时根据不同的图像,设置不同的道路识别算法和参数,以优化道路识别结果。最终实现一个完整的、可运行的Google地图中道路的识别软件。三、总体设计开发一款基于OpenCV开源计算机视觉库,以Microsoft visualC+ 6.0 为开发环境,处理Google地图中的图像识别道路并标记的软件。它能够打开输入任意一张图像,帮助用户在一张包括居民区、道路、各种建筑、农田等模块的Google地图中,快速查找道路的位置,且能根据图像的标注,形成一条连续的路径。1利用OpenCV开源计算机视觉库,以Microsoft visualC+ 6.0 为开发环境开发MFC程序。2理解hough变换原理,根据特定的地理位置,和后期的道路标示的优化改进算法(根据道路的平行性,连续性,直线性)。3.图像处理的过程如下:(1)先对图像进行预处理(边际检测排除干扰和噪声)(2)再hough变换算法进行处理,接着优化处理(排除明显的错误和道路融合)(3)最后过滤干扰区域输出显示对道路进行标识后的图像。预处理边缘检测Hough变换线条检测过滤干扰区域输入图像图1 图像处理过程图在Google地图中道路的识别软件的分工上,我们小组把系统设计分为三大方面:图像处理模块、面向用户的界面的设计、模块的整合以及系统测试。四、详细设计说明(1)配置环境在软件制作过程中个,我们需要做许多对图像的操作,需要在实习机子上安装OpenCV软件。但在安装该软件的过程中,出现了许多问题。首先,机房每台实习机器为了安全,都配置有还原卡,而在安装完该软件,并配置完环境变量之后需要重新启动计算机,这样之前的配置也会消失。在与看管机房的老师协商之后,我们获得了短暂的不带有还原卡搭建实习环境的时间。 其次,由于对OpenCV软件不太了解,第一次安装的OpenCV 2.0版本与C+ 6.0不能很好的兼容,导致在搭建环境过程中出现了许多问题。在清楚了问题的原因之后,重新安装了1.0版本。 主要环境搭建如下: 在C+ 6.0中做如下配置:(2)生成单文档应用程序我使用的是Visual C+ 6.0。首先,按照VC的向导,产生一个默认的MFC的工程,注意,选择SDI单文档支持的,同时最好选择“use MFC As a static library”(防止MFC中使用OpenCV的内存泄露问题)具体请参看下面两幅图所示就这样子一路下去之后,基本的MFC框架就创建完成了。 (3)加入OpenCV库支持现在加入openCV必须的头文件和库文件。如下图所示,我们添加库文件: cxcore.lib cv.lib highgui.lib (4)在Doc类中添加变量找到 *Doc 也就是文档类的定义,在开头加上 HighGui.h 的头文件包含, 同时添加一个变量CImage m_image;。 (5)添加虚函数添加两个函数,分别用来打开图片文件和保存图片文件,添加过程见下图的右键菜单。 分别添加函数OnOpenDocument 和 OnSaveDocument 如下面的代码 BOOL CSDI OpenCVDoc:OnOpenDocument(LPCTSTR lpszPathName) if (!CDocument:OnOpenDocument(lpszPathName) return FALSE; / TODO: Add your specialized creation code here m_image.Load(lpszPathName); return TRUE;BOOL CSDI OpenCVDoc:OnSaveDocument(LPCTSTR lpszPathName) / TODO: Add your specialized code here and/or call the base class m_image.Save(lpszPathName); return TRUE; / return CDocument:OnSaveDocument(lpszPathName);注意,上面本来是 return CDocument:OnSaveDocument(lpszPathName); 但是后来发现有问题,保存了图片,会导致保存后的图片的大小变成0了,改用 return TRUE;就没有问题了(6)在View类中添加显示图像代码在View类中间添加必要的图片显示代码,主要是在Ondraw里面。 void CSDI_OpenCVView:OnDraw(CDC* pDC)CSDI_OpenCVDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCImage & img = pDoc -m_image;CRect r;GetClientRect (&r);img.DrawToHDC(pDC-GetSafeHdc() ,r);编译整个程序,就可以通过“打开菜单”打开图像并且显示在MFC的View类中了。 (6)在Doc类中添加图像处理函数在Doc类中间添加必要的图像处理算法,主要是在OnIdentity()里面。 void CTest_mfcDoc:OnIdentity() / TODO: Add your command handler code here/载入已打开图片,供后面操作使用,会变成单通道 IplImage* src=cvLoadImage(tmp_lpszPathName,0);IplImage* dst; IplImage* color_dst; CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; int i; dst = cvCreateImage( cvGetSize(src), 8, 1 ); color_dst = cvCreateImage( cvGetSize(src), 8, 3 ); cvCanny( src, dst, temp6, temp5, 3 ); cvCvtColor( dst, color_dst, CV_GRAY2BGR );#if 0 lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); for( i = 0; i total,100); i+ ) float* line = (float*)cvGetSeqElem(lines,i); float rho = line0; float theta = line1; CvPoint pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b); pt1.y = cvRound(y0 + 1000*(a); pt2.x = cvRound(x0 - 1000*(-b); pt2.y = cvRound(y0 - 1000*(a); cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 ); #else lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, temp4, CV_PI/180, temp1, temp1, temp3 ); for( i = 0; i total; i+ ) CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); cvLine( color_dst, line0, line1, CV_RGB(255,0,0), 3, CV_AA, 0 ); #endif cvNamedWindow( Hough, 0 ); cvShowImage( Hough, color_dst );cvWaitKey(0); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&color_dst);编译整个程序,就可以识别图像中的道路并且显示。在CSetDlg类中添加参数设置函数在CSetDlg类中间添加必要的图像处理参数,首先添加设置对话框。总共要添加5个参数,添加了五个编辑框,分别映射到5个变量void CSetDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSetDlg)DDX_Text(pDX, IDC_EDIT1, m_para1);DDX_Text(pDX, IDC_EDIT3, m_para3);DDX_Text(pDX, IDC_EDIT4, m_para4);DDX_Text(pDX, IDC_EDIT5, m_para5);DDX_Text(pDX, IDC_EDIT6, m_para6);/AFX_DATA_MAP设置和更新函数是在OnOk1()里面。 void CSetDlg:OnOk1() / TODO: Add your control notification handler code hereUpdateData(TRUE);if(m_para1)temp1=m_para1;/if(m_para2)temp2=m_para2;if(m_para3)temp3=m_para3; if(m_para4)temp4=m_para4;if(m_para5)temp5=m_para5;if(m_para6)temp6=m_para6;UpdateData(FALSE);CDialog:OnOK(); 设置前的参数:设置后的参数:改进后的效果图:在Google地图道路识别系统中,我负责的用MFC编写用户图形接面设计以及软件调试。在本系统的构造中,我采用MFC引用OPENCV图形接口,从而通过调用封装的接口以及接口中的方法实现系统的功能。在程序的整合阶段,通过各个模块预留的接口,将各个模块进行整合,从而实现一个完整的Google地图道路识别软件。五、调试与测试(1)调试方法调试是排除程序中的错误,使程序正常运行并符合设计者的意图的过程。在调试过程中很多时候都会出现许多异常情况,如空指针异常、class not find这类错误。在对此系统进行调试时,采用每一个类分别测试的方法,即对每一个类分别进行调试代码。具体方法是在本系统的工程中建立一个用于调试的主函数类,然后在主函数中分别调用每一个类的实现,观察其结果与实际应得结果的差距,然后调试代码进行必要的修改。最后整合每个类,然后再进行调试、修改,直到最后的输出结果正确为止。(2)测试结果的分析和讨论测试是通过输入不同的数据来判断程序的健壮性、完整性等。测试主要需要输入各类数据来判断,跟调试是完全不同的一个概念。测试主要是针对用户的而调试是针对程序员的。如果在调试阶段出现问题,则大部分都是代码的语法出现错误。在测试阶段,如果是界面直接打开就出现异常,则一定是用JAVA语言在编程的时候逻辑出现错误。在这种情况下,一般要看程序的逻辑结构是否正确和你的思想是否正确。如果是在界面打开后基本上可以运行但有的结果出现异常,那就表明是程序中与其相关代码出现了错误,那就重新采用上述的方法进行单独的调试与测试,然后整合代码再测试。(3)主要问题及措施在程序的编程过程中,由于在编程的时候不认真、不仔细,以及一些设计上的疏忽,导致在调试过程中很多时候都会出现异常情况,如空指针异常、class not find这类错误。针对空指针异常,大多数情况是对某个类的实现未进行初始化导致的;而class not find这类错误则是所调用的某个类不存在或是为调用某个类造成的。在整合的过程中,由于以前我们都没有合作的经验,以及从未做过这么大的项目,所以在整合的过程中遇到了很多的问题,如:对类的命名不标准、所有的类都放在同一个包中。同时还有就是每个人在写程序的时候都是自己的风格,导致一开始不太了解这个类的意思。虽然整合的道路非常困难,但是通过对类的不断了解、修改,到下午下机的时候,基本上已经完成了系统的整合,系统已经初步成形了。(4)对存在问题的思考在测试阶段,程序因为我的不认真而出现了问题,并且浪费了大量的时间。但这也说明了一个问题,那就是我平时不太爱编程序,到实战时就出现了这种低级的错误,并且不能很快的发现。因此,在学习生活中,不能只看书本知识,而且还应该多上机来了解计算机,来编写程序。六、实习日志2010年9月6日 星期一今天是应用软件课程设计实习的第一天,我们一大早来到了计算机机房。早上,我们小组的成员对本次计实习的题目Google地图道路识别做了一个简单的讨论,对应该如何做、怎样做这几方面的问题都谈了一下个人的看法。通过小组成员讨论的结果和大体的方向,我们都在网上查找了一些基本的资料和借鉴了别人做的系统。下午,我们通过早上查找的资料,修正和完善了我们的方案,在老师的指导下最终得出了一个具体的实施方案采用MFC语言和OPENCV图形接口的实现系统的设计。同时通过对方案的细分,我们把系统划分为了三大模块,最近根据小组成员的个人特长,划分了每个人的具体任务。2010年9月7日 星期二我负责用户图形界面的设计。必须要在VC中配置OPENCV环境,这里我们在/ opencv中文网站上得到了详细的配置方法和步骤。最后,通过自己总结所得的具体的实施方法,书写了本次实习的实施计划书。2010年9月8日 星期三在前两天的实习准备阶段,我们小组确立了Google地图道路识别系统的具体实施方案,并且划分了每一个人的实施模块。今天我的主要任务是在昨天的配置环境的基础上生成单文档应用程序。2010年9月910日 星期四、五接下的两天我学习了在MFC中使用OpenCV,了解OpenCV中,数组操作,绘图函数,图像处理,模式识别。具体的有图像文件读入和显示,图像文件的创建、保存和复制canny边缘检测,Hough线段检测,图像颜色分布直方图,高级图像处理等知识和技术,为后期的编程做好了理论基础。2010年9月12日 星期一我和研究图像处理算法的队友讨论对图像的进行canny边缘检测,以及Hough变换,对线段的标识。接着我编写了道路识别事件响应函数中,函数中包括了canny边缘检测,以及Hough变换,对线段的标识的算法。2010年9月13日 星期二我们发现算法对大部分图像道路的识别较差,我们提出了我们的改进方案。我们的改进的方案之一便是改变算法中的关键参数来实现预期的Google地图道路识别的效果。为此我们预留了用户手动设置参数的接口,并且详细说明了这些参数的含义。2010年9月14日 星期三本次实习已基本上完成了,通过昨天各个模块的整合,一个Google地图道路识别系统已经初见雏形。接下来我们要做的是测试。在测试的过程中老师提出了很多宝贵的意见并指出我们的应用程序还需要改进和优化。2010年9月15日 星期四转眼间本次实习已经要结束了,我们在百忙之中尝试解决多视图的问题,闪屏的问题,图像显示尺寸的问题,虽然很多问题都没有得到实质性的解决,但是在这过程中我们学会查看英文文档MSDN,体会到MFC编程的事件响应,消息驱动的机制七、实习总结通过两周的实习,我收获了不少。首先,当一个项目很庞大的时候,一个人把所有的事都做很困难,要学会与团队协作,一起完成课程设计。其次,在实施项目之前,要设计好实施计划,理论上要过硬,行的通。第三,还要充分从深层次理解所用到的技术,若还不熟悉那么要提前充电,不要编写代码边学习,大部分情况下写出来的代码都不符合规范。第四,实习过程中有时候没有方向,没有思路,情绪低落,可以和队友沟通,让队友帮助你度过难关。八、附录:核心代码清单/ test_mfcDoc.cpp : implementation of the CTest_mfcDoc class/#include stdafx.h#include test_mfc.h#include test_mfcDoc.h#include mainfrm.h #include string.h#include #include #include #include #ifdef _DEBUG#define new DEBUG_NEW#define CV_COMP_CORREL 0 /直方图相似度对比方法,本程序采用CORREL 0#define CV_COMP_CHISQR 1#define CV_COMP_INTERSECT 2#define CV_COMP_BHATTACHARYYA 3#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifCString tmp_lpszPathName; /打开文件的文件名int temp1=50,temp3=10,temp6=100,temp5=200;float temp4=1;/ CTest_mfcDocIMPLEMENT_DYNCREATE(CTest_mfcDoc, CDocument)BEGIN_MESSAGE_MAP(CTest_mfcDoc, CDocument)/AFX_MSG_MAP(CTest_mfcDoc)ON_COMMAND(IDM_Identity, OnIdentity)ON_COMMAND(ID_BUTTON32772, OnIdentity)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CTest_mfcDoc construction/destructionCTest_mfcDoc:CTest_mfcDoc()/ TODO: add one-time construction code hereCTest_mfcDoc:CTest_mfcDoc()BOOL CTest_mfcDoc:OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;SetTitle(Google地图中道路识别2.0);/ TODO: add reinitialization code here/ (SDI documents will reuse this document)return TRUE;/ CTest_mfcDoc serializationvoid CTest_mfcDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO: add storing code hereelse/ TODO: add loading code here/ CTest_mfcDoc diagnostics#ifdef _DEBUGvoid CTest_mfcDoc:AssertValid() constCDocument:AssertValid();void CTest_mfcDoc:Dump(CDumpContext& dc) constCDocument:Dump(dc);#endif /_DEBUG/ CTest_mfcDoc commandsBOOL CTest_mfcDoc:OnOpenDocument(LPCTSTR lpszPathName) if (!CDocument:OnOpenDocument(lpszPathName)return FALSE;/ TODO: Add your specialized creation code heretmp_lpszPathName=lpszPathName;m_image.Load(lpszPathName);return TRUE;BOOL CTest_mfcDoc:OnSaveDocument(LPCTSTR lpszPathName) / TODO: Add your specialized code here and/or call the base classm_image.Save(lpszPathName);return CDocument:OnSaveDocument(lpszPathName);void CTest_mfcDoc:OnIdentity() / TODO: Add your command handler code here/载入已打开图片,供后面操作使用,会变成单通道 IplImage* src=cvLoadImage(tmp_lpszPathName,0);IplImage* dst; IplImage* color_dst; CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; int i; dst = cvCreateImage( cvGetSize(src), 8, 1 ); color_dst = cvCreateImage( cvGetSize(src), 8, 3 ); cvCanny( src, dst, temp6, temp5, 3 ); cvCvtColor( dst, color_dst, CV_GRAY2BGR );#if 0 lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); for( i = 0; i total,100); i+ ) float* line = (float*)cvGetSeqElem(lines,i); float rho = line0; float theta = line1; CvPoint pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b); pt1.y = cvRound(y0 + 1000*(a); pt2.x = cvRound(x0 - 1000*(-b); pt2.y = cvRound(y0 - 1000*(a); cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 ); #else lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, temp4, CV_PI/180, temp1, temp1, temp3 ); for( i = 0; i total; i+ ) CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); cvLine( color_dst, line0, line1, CV_RGB(255,0,0), 3, CV_AA, 0 ); #endif cvNamedWindow( Hough, 0 ); cvShowImage( Hough, color_dst );cvWaitKey(0); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&color_dst);/ CSetDlg dialogCSetDlg:CSetDlg(CWnd* pParent /*=NULL*/): CDialog(CSetDlg:IDD, pParent)/AFX_DATA_INIT(CSetDlg)m_para1 = temp1;m_para3 = temp3;m_para4 = temp4;m_para5 = temp5;m_para6 = temp6;/AFX_DATA_INITvoid CSetDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CSetDlg)DDX_Text(pDX, IDC_EDIT1, m_para1);DDX_Text(pDX, IDC_EDIT3, m_para3);DDX_Text(pDX, IDC_EDIT4, m_para4);DDX_Text(pDX, IDC_EDIT5, m_para5);DDX_Text(pDX, IDC_EDIT6, m_para6);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CSetDlg, CDialog)/AFX_MSG_MAP(CSetDlg)ON_BN_CLICKED(IDOK1, OnOk1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ CSetDlg message handlers/DEL void CSetDlg:OnChangeEdit1() /DEL /DEL /CSetDlg setDlg;/DEL /char c10;/DEL /CString str;/DEL /setDlg.m_para1=1;/DEL /setDlg.GetDlgItemInt(IDC_EDIT1,&setDlg.m_para1);/DEL /str.Format(%d,);/DEL / itoa(setDlg.m_para1, c, 10);/DEL /setDlg.m_para1+;/DEL /DEL /MessageBox(c,标题);/DEL /DEL / TODO: If this is a RICHEDIT control, the control will not/DEL / send this notification unless you override the CDialog:OnInitDialog()/DEL / function and call CRichEditCtrl().SetEventMask()/DEL / with the ENM_CHANGE flag ORed into the mask./DEL /DEL / TODO: Add your control notification handler code here/DEL /DEL /DEL void CSetDlg:OnUpdateEdit1() /DEL /DEL / TODO: If this is a RICHEDIT control, the control will not/DEL / send this notification unless you override the CDialog:OnInitDialog()/DEL / function to send the EM_SETEVENTMASK message to the
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 26045-2025蓄电池板栅用铅合金锭
- 2025年一级建造师考试试题(综合卷)附答案详解
- 信息监理师试题及答案
- 研学旅行经验交流课件
- 度绍兴市继续教育公需科目试题及答案
- 建筑电气工程师面试题及答案
- 心理学题目(附答案)
- 执业中药师考试核心知识试题及答案
- 执业药师继续教育试题及答案
- 投资银行试题及答案
- 人教版初中化学九年级上册第六单元《碳和碳的氧化物》课题1《金刚石、石墨和C60》第二课时《单质碳的化学性质》教学设计
- 救护车合作协议书合同
- 【西安交通大学】2025年电力人工智能多模态大模型创新技术及应用报告
- 《妇产科宫颈癌》课件
- 上下楼梯安全课件
- 养猪场成本核算流程
- 老年患者安全用药
- 炼钢厂铁水包使用管理制度(4篇)
- 充电宝安全教育
- GB/T 19077-2024粒度分析激光衍射法
- 合同解除协议书范例模板
评论
0/150
提交评论