基于vc与opencv的路标识别系统开发设计内容摘要:

图 路 标识别流程图 本文的研究方面 本文研究的是自然场景下交通标志牌的检测与识别,它是通过安装在车辆上的摄像机来获取室外的交通标志,将所获取的交通标志图像送入计算机,通过计算机来完成交通标志的快速检测与识别。 所有的交通标志牌都处于自然场景下,所受到的干扰较多,主要有以下几个方面: (1)光照影响。 由于晴天、雨天、雾天,还有雪天等等不同的自然环境下,图像所获得的光照条件是不同的,因此拍摄获得的交通标志牌的图像质量参差不齐; (2)噪声影响。 在图像获取过程中噪声在所难免,克服噪声是交通标志牌检测与识别的重要部分; (3)交通标 志牌形状,大小的不确定性。 由于标志牌是通过安装在汽车上的摄像机拍摄获取的,所获得的标志牌的形状、大小在不同条件下会有明显不同,这给标志牌的检测与识别增加了难度; (4)运动模糊。 交通标志牌在获取过程中,难免会受到汽车的抖动,以及相机与景物之间相对运动的影响,产生运动模糊,从而影响图片质量; 获取图像 图像预处理 放大缩小 滤波 边缘检测 图片分割 获得路标 二值化 形态学处理 获得样例特征值 识别路标 输出结果 武汉工程大学计算机科学与工程学院 综合设计报告 5 (5)标志牌的遮挡、破损。 由于交通标志长期暴露在自然条件下,因此所拍摄到的图像,难免存在损毁、缺省现象,而且交通标志牌都是安放在道路两侧,近年来受到绿化加强影响,交通标志牌常常受到树木以及其他障碍物的遮挡。 在以上复杂的自然状况下,如 何快速检测与识别交通标志牌,是本课题研究的重点与难点。 为了克服以上不利条件影响,本文主要从以下几个方面进行研究: (1)为了克服噪声和运动模糊对图像检测的影响,本文在实验中分析了几种滤波算法后,采用中值滤波方法来消除随机噪声; (2)为了克服光照对交通标志分割的影响,同时提高算法的实时性,本文在 RGB颜色空间下,采用计算三基色之间的相对值来克服光照影响,实现标志牌的分割,然后在得到的二值图像中结合交通标志的形状特征,实现交通标志的定位。 (3)为了克服交通标志牌的形状变化影响识别效果,本文采用 旋转方式对 检测到的交通标志牌提 取特征向量,组成特征库,然后采用图像匹配技术和 K最近邻算法 实现交通标志分类识别。 武汉工程大学计算机科学与工程学院 综合设计报告 6 第三章 详细设计 图像的打开显示和保存 图像的打开比较简单,主要用到了 OnOpenDocument()函数,通过该函数传入的lpszPathName 参数,就可以打开选中的图片。 m_pImage = cvLoadImage(lpszPathName, 1)。 上面这句代码就是调用 opencv 里的 LoadImage 函数,将选中的图片载入到 IplImage 型变量 m_pImage 中,后面就可以调用 opencv 的各种函数对 m_pImage 进行操作了。 图像的显示代码主要在视图类的 OnDraw 函数中,这样每次窗口的重绘都会调用该函数从而将经过处理的图像实时地显示出来。 图像的保存也比较简单,只需要在 MFCView 类中定义图片格式,调用保存对话框,选择路径后将图片数据传入 Doc类的 DocSave(strFileName,pDoc())函数中,在此函数中调用 opencv 里的函数 CvSaveImage()即可。 下面就是保存图像的核心代码: cvSaveImage(lpszPathName, m_pImage)。 该函数就可以将图像 m_pImage 保存在指定的路径 lpszPathName 中。 其中 lpszPathName 是通过打开文件时自动获得的该文件的所在的路径。 所使用的函数如表 31: 表 31 图像显示保存主要函数函数说明 BOOL CDDDoc::OnOpenDocument(LPCTSTR lpszPathName) 打开图片函数。 lpszPathName 表示选择的路径。 void CDDView::OnFileSaveAs() View 响应消息,函数图像文件保存。 BOOL CDDDoc::Save(LPCTSTR csFileName,IplImage* pImg) csFileName 为保存文件的名字 pImg 为图像 数 据 地 址 , 调 用cvSaveImage(csFileName,pImg)保存。 图像变换 图像的几何变化研究图像的放大、缩小以及旋转的功能。 缩放是使图像按比例因子放大或缩小的变换。 变比计算公式为: X1=X*Sx; Y1=Y*Sy。 按公式变比时,不仅对象的大小变化,且对象离原点的距离也发生了变化,如果只希望变换对 象的大小,而不希望变比对角离原点的距离,则可采用固定点变比。 图像旋转是以某个参考点为圆心,将对象上的个点( X,Y)围绕圆心转动一个逆时针角度,变为新的坐标( X1,Y1)的变换。 要用到几个函数: cvResize、 cvCopy。 函数列表 32: 表 32 图像几何变换主要函数说明 void CDDView::Tuxiangsuofang() 功能函数,由响应函数调用,接受对话框数值,实现图像的放大缩小功能。 cvCreateImage( CvSize size, int depth, int channels )。 创建头并分配数据 , size 图像宽高, depth图像元素的位深度, channels 每元素通道数。 cvResize( const CvArr *src, CvArr* dst, int interpolation CV_DEFAULT( CV_INTER_LINEAR )) 调整图像 src,使它精确匹配目标 dst。 src 源图像 dst, 目标图像 ,interpolation 修改 、 插补的方法。 cvCopy( const CvArr* src, CvArr* dst, 拷贝一个数组给另一个数组。 src输入武汉工程大学计算机科学与工程学院 综合设计报告 7 const CvArr* mask CV_DEFAULT(NULL) ) 数组 , dst 输出数组 , mask 操作掩码是 8 比特单通道的数组 , 它指定了输出数组中被改变的元素。 函数 cvResize 中 interpolation 为插值方法,包括最近邻插值、双线性插值、立方插值等,函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小,原理为图像放大时有的地方像素不变,有的地方缺少颜色值,于是函数在缺少的地方依照差值方法自动补上颜色信息,缩小时删除一定像 素值,使得图像在缩小或者放大后尽量和源图像保持颜色信息一致。 函数 cvCopy 的语法为: void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL),其中 src 为输入数组, dst 为输出数组, mask 为在、操作掩码是 8 比特单通道的数组,它指定了输出数组中被改变的元素,函数 cvCopy 从输入数组中复制选定的成分到输出数组,如果输入数组中的一个是 IplImage 类型的话,其 ROI 和 COI 将被使用,输入输出数组必须是同样的类型、维数和大小,该函数也可以 用来复制散列数组。 但需要注意的是,复制的两个数组其维数必须相同,不然会出现未知错误,比如彩色图像与灰度图像相互复制时,其通道不相同,要先转化才能使用。 创建一个新图可以使用 cvCreateImage()函数,其作用 创建头并分配数据 , nchannels 为通道数,彩色图像为 3,灰度与二值图像通道为一。 图像的放大、缩小、旋转效果如下: ( a)原图 武汉工程大学计算机科学与工程学院 综合设计报告 8 (b)图像顺时针旋转 90 度 (c)宽度增大一倍,长度缩小一倍 图 图像的缩小、放大、旋转 图形信息操作 直方图是图 像处理中一种十分重要的图像分析工具,它描述了一幅图像的灰度级内容,任何一幅图像的直方图都包含了丰富的信息,它主要用在图像分割、图像灰度变换等处理过程中。 从数学上来说图像直方图是图像各灰度值统计特性与图像灰度值的函数,它统计一幅图像中各个灰度级出现的次数或频率,表达一幅图像灰度级分布情况的统计表。 从图形上来说,它是一个二维图,横坐标表示图像中各个像素点的灰度级,纵坐标视图像的类型而定,对于连续图像信号,它是灰度值出现的概率密度,对于数字图像信号,它是某以灰度值的像素个数。 图像的直方图只展示具有某一灰度的像素 数,并不提示哪些像素固定在图像的某一区域上。 因此引入直方图均衡化的概念。 我们可以通过对直方图进行调整,使得图像数据信息量增大,这样也使得画面更清晰。 直方图均衡化的原理是:将原图像通过某种变换,得到一幅灰度直方图为均匀分布的新图像的方法。 设图像均衡化处理后,图像的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均有的概率分布,图像看起来就更清晰了。 在该模块中需要实现图像灰度化,二值处理,直方图统计,直方图均衡化。 用到的函数如下表 33。 表 33 图形信息处理主要函数说明 void CDDView::Huiduhua() 功能函数,由 View 响应函数调用,实现彩色图像灰度化。 cvCvtColor( const CvArr* src, CvArr* dst, int code ) 颜色空间转换函数。 Src 输入数据,dst 输出数据, code 为色彩转化模式。 cvCloneImage( const IplImage* image ) 把 src 图像复制给 dst cvThreshold( const CvArr* src, CvArr* dst, double threshold, double ax_value, int threshold_type )。 对单通道数组应用固定阈值操作 ,src:原始数组 , dst:输出数组 ,threshold:阈值 , max_value:最大值 vCreateHist( int dims, int* sizes, int type, float** ranges CV_DEFAULT(NULL), int uniform CV_DEFAULT(1)) 创建直方图 , dims:直方 图维数,sizes:直方图维数尺寸数组, type:表示格式, uniform:归一化标示。 void cvCalcHist( IplImage** image, CvHistogram* hist,int accumulate CV_DEFAULT(0), const CvArr* mask CV_DEFAULT(NULL) ) 计算图像 image(s) 的直方图。 Image:输入图像, hist:直方图指针, accumulate:累计标识, mask:操作。 cvGetMinMaxHistValue( const CvHistogram* hist, float* min_value, float* max_value, int* min_idx CV_DEFAULT(NULL), int* max_idx CV_DEFAULT(NULL))。 发现最大最小直方块, hist:直方图,min_value:直方图最小的指针,max_value:最大值指针, min_idx:数组中最小坐标指针, max_idx:最大坐标指针。 武汉工程大学计算机科学与工程学院 综合设计报告 9 cvRectangle( CvArr* img, CvPoint pt1, CvPointpt2, CvScalar color, int thickness CV_DEFAULT(1), int line_type CV_DEFAULT(8), int shift CV_DEFAULT(0))。 通过对角线上的两个顶点绘制简单、指定粗细或者带填充的矩形 ,img: 图像 pt1: 矩形的一个顶点。 pt2: 矩形对角线上的另一个顶点 cvShowImage( const char* name, const CvArr* image )。 在指定窗口中显示图像 将彩色图像转化为灰度图像的函 数为: cvCvtColor(),运用该函数对图像进行灰度化处理。 Code 可以取两个值,参数 CV_BGR2GRAY 是将彩色图像转化为灰度图像,参数 CV_GRAY2RGB 是灰度图像转化为彩色图像。 其中当 code 选用 CV_BGR2GRAY时, dst 需要是单通道图片。 当 code 选用 CV_BGR2HSV 时,对于 8 位图,需要将rgb 值归一化到 01 之间。 这样得到 HSV 图中的 H 范围才是 0360, S 和 V 的范围。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。