基于opencv的车辆轮廓线检测本科毕业论文(编辑修改稿)内容摘要:
得到精确的实验结果打好基础。 本试验中,在测试场地所 采集到的车辆图片,由于场地和环境、天气等因素的影响,存在这许多的噪声,所以需要对图像进行平滑处理才能使车辆的轮廓保持清晰,同时还要除去图像中的高频噪声。 采用中值滤波,能实现这一目的。 中值滤波器在滤除长尾叠加噪声和叠加白噪声时能够取得较好的效果。 为了使中值滤波在更多的场合运用 ,人们对它进行了很多的算法改进 ,如一种改进就是权重中值滤波 ,其原理是给窗口内的各像素指定不同的权值,以此来平衡抑制图像噪声与保持图像细节之间所存在的矛盾 ,这种较传统的中值滤波方法而言,能更好的保持图像的细节,但也有一定不足,即牺牲了图像 的噪声抑制;还有一种方法是以排序阈值为基础的开关中值滤波算法。 这种方法的原理是对图像的噪声点和平坦的区域进行中值滤波,效果显著,能够有效的滤除噪声 ,同时,因为对边缘细节区域没有做任何处理,故有良好的细节保持能力。 为了处理更大概率的冲激噪声,人们还改进出一种自适应中值滤波器,这种滤波器在对图像进行处理时的特点是,它可以根据条件需要来改变领域的大小。 图像的二值化阈值分割 在图像处理过程时,有着相当多的图像分割方法, 其中一种简单而又高效的方法就是二值化。 在对图像进行二值化时可以由下面给出的公式来实 现 : ( x,y) = 在这个公式中 ,H(x,y)代表的是中在原图像中( i, j)处像素的灰度; ( i,j)的值只能是 1 或者 0,代表的是这点在二值化过后的像素值 ,用 0来表示上面公式中所得到的二值化图像中的背景,用 1 来表示对象图像。 上述公式中, T 代表的是用于二值化处理的闭值。 只要决定好了阈值的选取,图像的二值化过程也变得相对简单。 图像分割的作用是把要处理的图像空间分割成若干具有特定意义的区域。 在本第 3 章 车辆图像的处理 10 篇文章中,要完成对车辆轮廓线的检测并绘制出车辆的轮廓线,首先要完成的就是通过输入的图像进行分割,得到该图的二值化图像。 所以为了将图像中的指定对象和背景分割,就要使用二值化阈值分割法将两者当作用是以阈值来分割的不同成分来实现去除图像背景的目的。 采用二值化阈值分割法时要先确定分割阈值,根据顺序来读取图像中各像素点的灰度值,然后和确定好的阈值进行对比,如果该点的灰度值是大于或者等于确定的阈值,就用 1来代替;否则就用 0代替该点的灰度值。 在对输入的 图像进行了二值化分割后,能够得到该图像的黑白图像,为接下来的实验做好准备工作。 车辆轮廓提取与轮廓跟踪 在对输入图像进行了预处理后,得到了去噪平滑的二值化图像,在此基础上,利用轮廓提取语句对汽车轮廓进行提取,并用跟踪语句对图像轮廓进行跟踪,得到完整的轮廓曲线。 轮廓提取 图像的轮廓由外轮廓和内轮廓两类组成。 轮廓的提取需要特定的算法,这个算法很简单,原理是把图像内部的点掏空:如果在二值化的图像中有一个点是黑色,并且与它相邻的 8个点都是黑色时,那么这个点就称为是内部点,需要把这个点删除。 应该指出的是,虽然我们处理时用的是二值图像,但是实际上我们输入的却是 256 级的灰度图,只不过我们在处理图像的时候只使用到了 0 和 255 这两种颜色。 OpenCV 提供的寻找轮廓的函数如下: inttotals=cvFindContours(img,storage,amp。 contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_NONE,cvPoint(0,0))。 其中 img 是二值图像, storage 是内存存储序列, contours 指向存储的第一个轮廓, CvMemStorage *storage =cvCreateMemStorage(0)为内存存储序列,CvSeq *contours = 0;指向 storage 中的序列。 CV_RETR_LIST 表示的是图像处理后提取的图像轮廓在内存中的排列方式,有下面四种方式 : CV_RETR_EXTERNAL: first = c0; CV_RETR_CCOMP:轮廓的排列方式是按照从里依次到外,从右依次到左的顺序, 这个表示的是一个双向链表; CV_RETR_LIST: first = c01001 – c01000 – h0100 – h0000 – h0100 – h0000 – c010 – c000 – h01 – h00 – c0 这也是双向链表; CV_RETR_TREE 第 3 章 车辆图像的处理 11 轮廓提取的代码如下所示: include iostream include include include using namespace std。 int main() { CvMemStorage *storage = cvCreateMemStorage(0)。 // 内存存储序列 IplImage *img = cvLoadImage(E:\\study_OpenCV_video\\lesson14_1\\Debug\\55。 png, 0)。 IplImage *imgColor = cvCreateImage(cvGetSize(img), 8, 3)。 IplImage *contoursImage = cvCreateImage(cvGetSize(img), 8, 1)。 CvSeq *contours = 0, *contoursTemp = 0。 cvZero(contoursImage)。 cvThreshold(img, img, 100, 255, CV_THRESH_BINARY)。 // 二值化操作 cvCvtColor(img, imgColor, CV_GRAY2BGR)。 int totals = cvFindContours(img, storage,amp。 contours, sizeof(CvContour), //img 必须是一个二值图像 storage 用来存储的contours 指向存储的第一个轮廓 CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, cvPoint(0,0))。 contoursTemp = contours。 int count = 0。 int i。 for(。 contoursTemp != 0。 contoursTemp = contoursTemp h_next) /// 这样可以访问每一个轮廓 ====横向轮廓 { for(i = 0。 i contoursTemp total。 i++) // 提取一个轮廓的所有坐标点 { CvPoint *pt = (CvPoint*) cvGetSeqElem(contoursTemp, i)。 // cvGetSeqElem 是为了得到轮廓中一个点的函数 cvSetReal2D(contoursImage, pty, ptx, 255。 0)。 第 3 章 车辆图像的处理 12 cvSet2D(imgColor, pty, ptx, cvScalar(0,0,255,0))。 } count ++。 CvSeq *InterCon = contoursTempv_next。 // 访问每个轮廓的纵向轮廓 for(。 InterCon != 0。 InterCon = InterCon h_next) { for(i = 0。 i InterContotal。 i++ ) { CvPoint *pt = (CvPoint*)cvGetSeqElem(InterCon, i)。 cvSetReal2D(contoursImage, pty, ptx, 255。 0)。 cvSet2D(imgColor, pty, ptx, cvScalar(0, 255, 0, 0))。 } } } cvNamedWindow(contoursImage)。 cvShowImage(contoursImage, contoursImage)。 cvNamedWindow(imgColor)。 cvShowImage(imgColor,imgColor)。 cvWaitKey(0)。 cvReleaseMemStorage(amp。 storage)。 // 也要释放内存序列空间 cvReleaseImage(amp。 contoursImage)。 cvReleaseImage(amp。 imgColor)。 cvDestroyWindow(contoursImage)。 cvDestroyWindow(imgColor)。 return 0。 SPAN style=FONTFAMILY: Arial,Helvetica,sansserif}/SPAN 轮廓跟踪 对一个简单的二值化图像而言,对它的闭合边界的轮廓进行跟踪,只需一个简单的算法:首先需要依照先左后右,先上后下的顺序依次对图像进行搜索,在搜索结果中,把第一个黑点当作是左上方的边界点,记为点 a。 在这个边界点 a 周围,右,右下,下,左下这四个相邻的点当中需要至少有一个点也是边 界点,那么把这个点记作 b。 然后又从 b 点为起点开始找起,依照从右,右下,下,左下,左,左上,上,右上的搜索顺序依次来找到与 b 点相邻的周围点中的边界点,如第 3 章 车辆图像的处理 13 果有,那么记这个点为点 c。 若通过 b点查找到的边界点 c 点就是 a点,那就表明对图像的搜索在此时已经经过了一个轮回,结束运行的搜索程序;如果 c点不是 a 点,那么又将从 c点开始继续搜索,一直到找到点与 a 点为同一点时停止程序。 根据边界点的定义来判断一个点是否是边界点十分容易,原理很简单:如果一个点的上下左右的四个相邻的点搜索出来都是黑点,那么这个点就不是边界点,否则这个点是边界点。 第 4 章 基于 OpenCV 的车辆轮廓线检测实现 14 第 4 章 基于 OpenCV 的车辆轮廓检测实现 本文利用 OpenCV 提供的强大的图像处理函数来对读取的车辆图片进行一系列的处理,以此来实现车辆轮廓线检测的目的。 流程图如下所示: 图像读取、显示及释放 图像读取 从文件中读取图像时需要头文件 include , 可采用以下语句来读取图像: Ipllmage*img=0; img=cvLoadImage( fileName)。 if(。 img) printf(“ Could not load image file。基于opencv的车辆轮廓线检测本科毕业论文(编辑修改稿)
相关推荐
( Data)区。 其中,信号段的速率位以及长度位决定着数据的比特率,进而决定其调制方式,编码速率等一系列参数值。 如图 22 所示, OFDM 的前导训练序列( Preamble Training Symbol) 包括 10 个短训练序列( Short Training Symbol)、 2 个长训练序列( Long Training Symbol)。 前导训练序列用来做系统的同步、信道估计
灰度 图像 中,由于 其 本身计算公式的影响,噪声点是肯定存在 于 其中的,并且 对图像的质量有很大的影响。 作为一种 对 图像 进行 平滑去噪的手段,中值滤波既可第 3 章 车辆图像的处理 9 以去除孤点噪声点, 也可以保持图像的边缘特性, 适于光线条件较好的环境。 中值滤波是 一种以 排序统计理论 为基础 的 非线性信号处理技术,它的作用是能够 有效抑制噪声。 它是一种 和卷积相似的
现,游戏开发公司迫切需要一个功能强大、兼容性好的 3D 图形接口,而当时微软公司自己的 3D 图形接口 DirectX 功能却是很糟糕。 微软公司最终在 Windows 95 的 OSR2 版和后来的 Windows 版本中加入了对 OpenGL 的支持。 这样,不但许多支持 OpenGL 的电脑 3D 游戏得到广泛应用,而且许多在 3D图形设计软件也可以运用支持 OpenGL 标准的 3d
图 导频信息的插入方式 在 频域抽样定理 中 ,信号的 频域抽样对应于时域的周期延拓,因此,必 14 须要求时域下信号的 周期延拓不产生 混叠失真,以 满足频域下信号的复原。 转化为公式即为: max1 fcNf 。 化简后得到: max1fcN f (31) 其中 fN 是频率方向上的最小间隔, max 是最大时延扩展 , cf 是 归一化的子载波间隔。
Simulator Version2) 是一款开放源代码的网络模拟软件,最初由加州大学伯克分校 ( UC Berkeley) 开发。 它最初的开发目的是为了研究大规模网络以及当前和未来网络协议的交互行为。 它为模拟研 究有线和无线网络上的 TCP/IP、路由和多播等协议提供了强有力的支持。 NS2 是一个开放源代码软件,任何人可以获得、使用和修改其源代码。 正 因为如此
lot ftNNN NN (33) 其中 sN 是一帧所包含的正交频分复用符号个数 , cN 是子载波数。 为满足优良的信道传输特性,时域抽样点数应和和频域抽样点数近似相等,即: m a x12d t c f df T N f N f T (34) 综上所述,根据已知的导频信息,便可获得信 道在导频位置的传输特性,进而获得整个信道的传输特性。