怎么使用opencv识别线段ab的两个端点并且检测到端点烦人坐标

2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。【OpenCV图像识别中粗线条端点检测】-模式及实现-模式及实现-真格学网-IT技术综合网站
OpenCV图像识别中粗线条端点检测
日期: 1:31:00 来源:本网整理
希望我们收集此问题的解决方案对所有碰到此问题的朋友有帮助.以下是
本文相关:
上一条:下一条:Hough变换原理最直观简单的说明:
Opencv函数 cvHoughLines2 实现了用于线段检测的不同 Hough 变换方法. Example. 用 Hough transform 检测线段
  此函数是opencv图像变换函数中的一个,主要用来访问霍夫变换的两个算法&&&标准霍夫变换(SHT)和累计概率霍夫变换(PPHT)。
   CvSeq* cvHonghLines2(
   CvArr* image,
   void* line_storage,
   int mehtod,
   double rho,
   double theta,
   int threshold,
   double param1 =0,
   double param2 =0
  输入 8-比特、单通道 (二值) 图像,当用CV_HOUGH_PROBABILISTIC方法检测的时候其内容会被函数改变。
  line_storage
  检测到的线段存储仓. 可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的线段。如果 line_storage 是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序).
  method
  Hough 变换变量,是下面变量的其中之一:
  CV_HOUGH_STANDARD - 传统或标准 Hough 变换. 每一个线段由两个浮点数 (&, &) 表示,其中 & 是直线与原点 (0,0) 之间的距离,& 线段与 x-轴之间的夹角。因此,矩阵类型必须是 CV_32FC2 type.
  CV_HOUGH_PROBABILISTIC - 概率 Hough 变换(如果图像包含一些长的线性分割,则效率更高). 它返回线段分割而不是整个线段。每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是 CV_32SC4.
  CV_HOUGH_MULTI_SCALE - 传统 Hough 变换的多尺度变种。线段的编码方式与 CV_HOUGH_STANDARD 的一致。
  与象素相关单位的距离精度
  弧度测量的角度精度
  threshold
  阈值参数。如果相应的累计值大于 threshold, 则函数返回的这个线段.
  param1
  第一个方法相关的参数:
  对传统 Hough 变换,不使用(0).
  对概率 Hough 变换,它是最小线段长度.
  对多尺度 Hough 变换,它是距离精度 rho 的分母 (大致的距离精度是 rho 而精确的应该是 rho / param1 ).
  param2
  第二个方法相关参数:
  对传统 Hough 变换,不使用 (0).
  对概率 Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一。
  对多尺度 Hough 变换,它是角度精度 theta 的分母 (大致的角度精度是 theta 而精确的角度应该是 theta / param2).
/* This is a standalone program. Pass an image name as a first parameter of the program.&& Switch between standard and probabilistic Hough transform by changing "#if 1" to "#if 0" and back */#include &cv.h&#include &highgui.h&#include &math.h&&int main(int argc, char** argv){&&& const char* filename = argc &= 2 ? argv[1] : "pic1.png";&&& IplImage* src = cvLoadImage( filename, 0 );&&& IplImage* dst;&&& IplImage* color_dst;&&& CvMemStorage* storage = cvCreateMemStorage(0);&&& CvSeq* lines = 0;&&& int i;&&&& if( !src )&&&&&&& return -1;&&&& dst = cvCreateImage( cvGetSize(src), 8, 1 );&&& color_dst = cvCreateImage( cvGetSize(src), 8, 3 );&&&& cvCanny( src, dst, 50, <span style="color: #, 3 );&&& cvCvtColor( dst, color_dst, CV_GRAY2BGR );#if 0&&& lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/<span style="color: #, <span style="color: #, 0, 0 );&&&& for( i = 0; i & MIN(lines-&total,<span style="color: #); i++ )&&& {&&&&&&& float* line = (float*)cvGetSeqElem(lines,i);&&&&&&& float rho = line[0];&&&&&&& float theta = line[1];&&&&&&& CvPoint pt1, pt2;&&&&&&& double a = cos(theta), b = sin(theta);&&&&&&& double x0 = a*rho, y0 = b*rho;&&&&&&& pt1.x = cvRound(x0 + <span style="color: #*(-b));&&&&&&& pt1.y = cvRound(y0 + <span style="color: #*(a));&&&&&&& pt2.x = cvRound(x0 - <span style="color: #*(-b));&&&&&&& pt2.y = cvRound(y0 - <span style="color: #*(a));&&&&&&& cvLine( color_dst, pt1, pt2, CV_RGB(<span style="color: #,0,0), 3, CV_AA, 0 );&&& }#else&&& lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/<span style="color: #, 50, 50, 10 );&&& for( i = 0; i & lines-&total; i++ )&&& {&&&&&&& CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);&&&&&&& cvLine( color_dst, line[0], line[1], CV_RGB(<span style="color: #,0,0), 3, CV_AA, 0 );&&& }#endif&&& cvNamedWindow( "Source", 1 );&&& cvShowImage( "Source", src );&&&& cvNamedWindow( "Hough", 1 );&&& cvShowImage( "Hough", color_dst );&&&& cvWaitKey(0);&&&& return 0;}
阅读(...) 评论()霍夫变换直线检测houghlines及opencv的实现分析
我的图书馆
霍夫变换直线检测houghlines及opencv的实现分析
11237人阅读
opencv(11)
图像处理(15)
版权声明:本文为博主原创文章,未经博主允许不得转载。
1. houghlines的算法思想
2. houghlines实现需要考虑的要素
3. houghlines的opencv实现,代码分析
4. houghlines的效率分析,改进
1. houghlines的算法思想
检测直线,houghlines标准算法,不考虑线段,不检测线段端点。
在直角坐标系和极坐标系的对应关系,点、直线在两个坐标系中是对偶关系。
即直角坐标系中的点是极坐标系中的线,直角坐标系中的线是极坐标系中的点。
反过来,也成立。
图像可知看做直角坐标系,检测图像中的直线,可以转化为统计检测极坐标系中的点(r,theta)。
2. houghlines实现需要考虑的因素
hough空间(离散极坐标)的表示
图像中直线的表示,由斜率和截距表示,而极坐标中用(r, theta)表示.
r = cos(theta)*x + sin(theta)*y
对于点(x0, y0) , 在极坐标中就是一条直线(很多对(r,theta)点):
r = cos(theta)*x0 + sin(theta)*y0
r,theta就是一对hough空间的变量表示。
旋转的theta不容易表示,若将r,theta看成直角坐标空间。
一个点(x0, y0), 就是一个正弦曲线。
r = cos(theta)*x0 + sin(theta)*y0
直角坐标系中的一点
对应于r-theta空间的一条正弦曲线
多个点在(r,theta)平面上就是多条正弦曲线,而多条正弦曲线会相交,交点就是直角坐标系中的直线。
直角坐标系中的一条直线上的三个点
对应于r-theta空间中三条曲线,并交于一点
接下来,就是要考虑 将r,theta离散化,形成离散化的hough空间,类似于一个mat矩阵/图像,用于统计交点的个数。
opencv取rtho,theta参数作为离散度量,空间分辨率。
则hough空间的大小为:
& & numangle = cvRound(CV_PI / theta);
& & numrho = cvRound(((width + height) * 2 + 1) / rho); // 有冗余,在r上留有一定的空白
3. 代码分析
rho: 霍夫空间的r粒度大小
theta: 旋转角度的粒度
threshold:直线上有多少个点的阈值
lines:输出lines结果
linesMax:lines的最大个数
[cpp] &&[cpp] static&void&&icvHoughLinesStandard(&const&CvMat*&img,&float&rho,&float&theta,&&&&&&&&&&&&&&&&&&&&&&&&&int&threshold,&CvSeq&*lines,&int&linesMax&)&&{&&&&&&cv::AutoBuffer&int&&_accum,&_sort_&&&&&&cv::AutoBuffer&float&&_tabSin,&_tabC&&&&&&&&const&uchar*&&&&&&&int&step,&width,&&&&&&&int&numangle,&&&&&&&int&total&=&0;&&&&&&float&&&&&&&int&r,&n;&&&&&&int&i,&j;&&&&&&float&irho&=&1&/&&&&&&&double&&&&&&&&&CV_Assert(&CV_IS_MAT(img)&&&&CV_MAT_TYPE(img-&type)&==&CV_8UC1&);&&&&&&&&image&=&img-&data.&&&&&&step&=&img-&&&&&&&width&=&img-&&&&&&&height&=&img-&&&&&&&&&numangle&=&cvRound(CV_PI&/&theta);&&&&//&霍夫空间,角度方向的大小&&&&&&numrho&=&cvRound(((width&+&height)&*&2&+&1)&/&rho);&&//&r的空间范围&&&&&&&&_accum.allocate((numangle+2)&*&(numrho+2));&&&&&&_sort_buf.allocate(numangle&*&numrho);&&&&&&_tabSin.allocate(numangle);&&&&&&_tabCos.allocate(numangle);&&&&&&int&*accum&=&_accum,&*sort_buf&=&_sort_&&&&&&float&*tabSin&=&_tabSin,&*tabCos&=&_tabC&&&&&&&&&&&&memset(&accum,&0,&sizeof(accum[0])&*&(numangle+2)&*&(numrho+2)&);&&&&&&&&for(&ang&=&0,&n&=&0;&n&&&&ang&+=&theta,&n++&)&//&计算正弦曲线的准备工作,查表&&&&&&{&&&&&&&&&&tabSin[n]&=&(float)(sin(ang)&*&irho);&&&&&&&&&&tabCos[n]&=&(float)(cos(ang)&*&irho);&&&&&&}&&&&&&&&//&stage&1.&fill&accumulator&&&&&&for(&i&=&0;&i&&&&i++&)&&&&&&&&&&for(&j&=&0;&j&&&&j++&)&&&&&&&&&&{&&&&&&&&&&&&&&if(&image[i&*&step&+&j]&!=&0&)&&&&&&//&将每个非零点,转换为霍夫空间的离散正弦曲线,并统计。&&&&&&&&&&&&&&&&&&for(&n&=&0;&n&&&&n++&)&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&r&=&cvRound(&j&*&tabCos[n]&+&i&*&tabSin[n]&);&&&&&&&&&&&&&&&&&&&&&&r&+=&(numrho&-&1)&/&2;&&&&&&&&&&&&&&&&&&&&&&accum[(n+1)&*&(numrho+2)&+&r+1]++;&&&&&&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&&&&//&stage&2.&find&local&maximums&&//&霍夫空间,局部最大点,采用四邻域判断,比较。(也可以使8邻域或者更大的方式),&如果不判断局部最大值,同时选用次大值与最大值,就可能会是两个相邻的直线,但实际上是一条直线。选用最大值,也是去除离散的近似计算带来的误差,或合并近似曲线。&&&&&&for(&r&=&0;&r&&&&r++&)&&&&&&&&&&&&&for(&n&=&0;&n&&&&n++&)&&&&&&&&&&{&&&&&&&&&&&&&&int&base&=&(n+1)&*&(numrho+2)&+&r+1;&&&&&&&&&&&&&&if(&accum[base]&&&threshold&&&&&&&&&&&&&&&&&&&&&accum[base]&&&accum[base&-&1]&&&&accum[base]&&=&accum[base&+&1]&&&&&&&&&&&&&&&&&&&&&accum[base]&&&accum[base&-&numrho&-&2]&&&&accum[base]&&=&accum[base&+&numrho&+&2]&)&&&&&&&&&&&&&&&&&&sort_buf[total++]&=&&&&&&&&&&&}&&&&&&&&//&stage&3.&sort&the&detected&lines&by&accumulator&value&&&&//&由点的个数排序,依次找出哪些最有可能是直线&&&&&&icvHoughSortDescent32s(&sort_buf,&total,&accum&);&&&&&&&&//&stage&4.&store&the&first&min(total,linesMax)&lines&to&the&output&buffer&&&&&&linesMax&=&MIN(linesMax,&total);&&&&&&scale&=&1./(numrho+2);&&&&&&for(&i&=&0;&i&&&linesM&i++&)&&//&依据霍夫空间分辨率,计算直线的实际r,theta参数&&&&&&{&&&&&&&&&&CvLinePolar&&&&&&&&&&&int&idx&=&sort_buf[i];&&&&&&&&&&int&n&=&cvFloor(idx*scale)&-&1;&&&&&&&&&&int&r&=&idx&-&(n+1)*(numrho+2)&-&1;&&&&&&&&&&line.rho&=&(r&-&(numrho&-&1)*0.5f)&*&&&&&&&&&&&line.angle&=&n&*&&&&&&&&&&&cvSeqPush(&lines,&&line&);&&&&&&}&&}&&
4. 效率分析
& & houghlines的计算效率比较低O(n*n*m),耗时较长,而且没有检测出直线的端点。
统计概论霍夫直线检测houghlinesP是一个改进,不仅执行效率较高,而且能检测到直线的两个端点。
先随机检测出一部分直线,然后将直线上点的排查掉,再进行其他直线的检测
1. 首先仅统计图像中非零点的个数,对于已经确认是某条直线上的点就不再变换了。
2. 对所以有非零点逐个变换到霍夫空间
& & a. 并累加到霍夫统计表(图像)中,并统计最大值
& & b. 最大值与阈值比较,小于阈值,则继续下一个点的变换
& & c. 若大于阈值,则有一个新的直线段要产生了
& & d. 计算直线上线段的端点、长度,如果符合条件,则保存此线段,并mark这个线段上的点不参与其他线段检测的变换
上一篇下一篇
我的同类文章
opencv(11)
图像处理(15)
·····
openCV的cvhoughine计算出来rho是原点到直线的距离,但是有距离 rho 为负的情况,这样的负距离代表什么意思呢?谢谢博主。Re:
回复hyt0520:不太明白你的意思,你理解的rho是输入,还是输出?能给出实例或测试代码或数据吗?我所看的是OpenCV2.3版本,rho是作为一个输入参数,是r的粒度大小。这个版本OpenCV源码没有查到cvhoughine,不过有cvHoughLines2。Re:
回复viewcode:我是用的cvHoughLines2进行检测的,我指的rho是检测直线的输出结果,源码中stage 4的部分是把检测出的直线进行输出,然后我使用如下代码获取检测到的直线的参数: for( i = 0; i & lines-& i++ ) { float* line = (float*)cvGetSeqElem(lines,i); float rho = line[0]; printf("line[%d] = %f\n", i, rho); float theta = line[1]; printf("line[%d] = %f\n", i, theta); }这样得到的rho的结果有负值,不是很能理解代表的含义。谢谢。Re:
回复hyt0520:我做了一下测试,切实有出现负值的情况,不过rho是负值,其theta也是有特征的,基本上都接近pi或180的大小。其实,这时的rho可以表示为正值,不过其对应的theta也应该进行变换。【百科】极坐标系中一个重要的特性是,平面直角坐标中的任意一点,可以在极坐标系中有无限种表达形式。通常来说,点(r,θ)可以任意表示为(r,θ ± n×360°)或(?r,θ ± (2n + 1)180°)ps:如果不是这个原因,你可以把测试的代码及数据图片发给我,我的邮箱。Re:
回复viewcode:哦,这下就明白了。是因为用的是极坐标方程,正负其实相当于映射出的正弦曲线中的正负,没有什么特定的含义。明白了。谢谢牛人!2楼
openCV的cvhoughine计算出来rho是原点到直线的距离,但是有距离 rho 为负的情况,这样的负距离代表什么意思呢?谢谢您。1楼
思想:先随机检测出一部分直线,然后将直线上点的排查掉,再进行其他直线的检测这样会不会出现,重复运行代码而检测出的结果不一致呢?我用matlab代码做实验时遇到这个问题,每次检测到的线段中总有部分不一样,或者检测到的线段总数不一样?这个问题有什么解决的办法么?Re:
回复cuicd2011:每次结果都不同,是因为你的随机数生成器每次使用的种子点都不同,而opencv中使用的RNG的seed直接是初始化为-1的。如 CvRNG rng = cvRNG(-1);然后 获取随机数 cvRandInt(&rng),每次的随机数都相同,结果也应该都相同了。如果随机数生成器的种子seed随时间变化,或随其他因素变化,每次生成的随机数不同,运行的结果也应该是不同的。你将随机数生成器的种子设为定值,再试试。
馆藏&22969
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢基于OpenCV的运动目标检测与跟踪
基于 VC 的运动图像跟踪算法设计学 专 班 学 姓院 业 级 号 名自动化学院指导教师 负责教师沈阳航空航天大学 2013 年 6 月
沈阳航空航天大学毕业设计(论文)摘要运动目标检测与跟踪作为计算机视觉领域的一个重要分支与基础,在工业、医疗 保健、航空航天、军事等各个领域具有广泛的应用前景,一直受到广泛的关注,并成 为计算机视觉领域的一个研究热点。但是由于运动目标检测问题本身的复杂性,运动 目标的检测与跟踪依然面临着诸多挑战。本文在现有研究成果的基础上,对静态场景 下的运动目标检测跟踪进行了深入的讨论。 本文首先对运动目标检测的基本方法----帧间差分法与背景差分法进行了深入的 学习和探讨,然后,借助于 OpenCV 技术,在 Visual C++ 6.0 编程环境下开发了运动 目标检测跟踪系统。该系统首先对采集的视频图像序列进行相关的预处理之后,将视 频图像序列中的运动目标比较可靠地检测出来。 通过系统的测试结果和数据可以得出 结论: 本文基于 OpenCV 设计的运动目标检测跟踪系统具有良好的实时性, 能够正确 地进行运动目标的实时检测与跟踪。 关键词:运动目标检测;帧间差分法;视频图像;OpenCVI 基于 VC 的运动图像跟踪算法设计Algorithm Design of Image Motion Tracking Based on VCAbstractMoving target detection and tracking field of computer vision as an important branch of the foundation, in the industrial, healthcare, aerospace, military and other fields with a wide range of applications, has been widespread concern, and the field of computer vision to become a research hotspot. However, due to moving target detection complexity of the problem itself, moving target detection and tracking is still facing many challenges. In this paper, based on the results of existing research in static scenes of the moving target detection and tracking in-depth discussion. This article first basic method of moving target detection - frame difference method and background subtraction method conducted in-depth study and discussion, and then, by means of OpenCV technology, Visual C 6.0 programming environment developed a moving target detection and tracking system. The system and the collection of the associated video sequence after pretreatment, the video image of the moving target sequence comparison reliably detected. Through systematic test results and data can be concluded: Based on OpenCV design moving target detection and tracking system has good real-time, be able to properly carry out real-time moving target detection and tracking. Keywords: mov fra OpenCVII 沈阳航空航天大学毕业设计(论文)目1 绪录论 ............................................................................................................................. 11.1 课题来源与背景 ......................................................................................................... 1 1.2 数字图像处理技术的发展与应用 ............................................................................. 1 1.3 运动目标检测技术的研究现状 ................................................................................. 2 1.4 本文的任务、主要内容及结构 ................................................................................. 4 1.5 本章小结 ..................................................................................................................... 5 2 OpenCV 技术介绍 ............................................................................................................. 6 2.1 OpenCV 简介 .............................................................................................................. 6 2.2 OpenCV 的优势 .......................................................................................................... 6 2.3 OpenCV 在 Visual C++6.0 下的配置方法 ................................................................. 7 2.4 OpenCV 中常用的数据结构及函数介绍 .................................................................. 9 2.5 本章小结 ................................................................................................................... 13 3 图像预处理 ..................................................................................................................... 14 3.1 图像的获取与灰度转换 ........................................................................................... 14 3.1.1 图像噪声 ............................................................................................................ 15 3.1.2 噪声的特征 ........................................................................................................ 15 3.1.3 噪声的分类 ........................................................................................................ 15 3.2 图像滤波 ................................................................................................................... 16 3.2.1 中值滤波原理 .................................................................................................... 16 3.2.2 中值滤波特性 .................................................................................................... 17 3.3 本章小结 ................................................................................................................... 18 4 运动目标检测 ................................................................................................................. 19 4.1 运动目标检测的基本方法 ....................................................................................... 19 4.1.1 帧间差分法 ........................................................................................................ 20 4.1.2 背景差法 ............................................................................................................ 21 4.1.3 光流法 ................................................................................................................ 22 4.2 本文采用的算法设计 ............................................................................................... 22III 基于 VC 的运动图像跟踪算法设计4.2.1 新算法思想 ........................................................................................................ 23 4.2.2 算法描述 ............................................................................................................ 23 4.3 图像的二值化 ........................................................................................................... 24 4.4 数学形态学滤波 ....................................................................................................... 25 4.4.1 腐蚀与膨胀 ........................................................................................................ 26 4.4.2 开运算和闭运算 ................................................................................................ 26 4.5 目标检测试验与结果分析 ....................................................................................... 28 4.6 本章小结 ................................................................................................................... 29 5 目标跟踪算法的研究 ..................................................................................................... 30 5.1 运动目标的跟踪原理 ............................................................................................... 30 5.2 运动目标特征 ........................................................................................................... 30 5.3 图像匹配法 ............................................................................................................... 31 5.4 基于团块的目标跟踪 ............................................................................................... 31 5.5 本章小结 ................................................................................................................... 34 6 程序结果演示与分析 ..................................................................................................... 35 6.1 运动目标检测与跟踪演示 ....................................................................................... 35 6.2 本章小结 ................................................................................................................... 37 结论 ..................................................................................................................................... 38 参考文献 ............................................................................................. 错误!未定义书签。 致 谢 ................................................................................................................................. 40 附录Ⅰ 程序清单 ............................................................................................................... 42IV 沈阳航空航天大学毕业设计(论文)1 绪论如何更好地、更准确地理解视觉信息已经成为当前科学研究的一个重要课题。而 计算机视觉就是通过计算机代替人眼及大脑对外界环境进行感知、分析和理解。随着 计算机技术的不断发展和计算机性能的逐渐提高, 计算机视觉成为了一个崭新且发展 迅速的热门领域,并成为计算机科学的重要研究领域之一。计算机视觉技术已经在许 多领域得到广泛应用,可以这么说,需要人类视觉的场地方几乎都可以借助于计算机 视觉。许多人类视觉无法触及的场合,如危险场景监测、微观物体精确定量、不可见 物体感知等,计算机视觉更突显其优越性。1.1 课题来源与背景随着计算机技术的高速发展,运动物体的检测和跟踪在图像处理、计算机视觉、 模式识别、人工智能、多媒体技术等领域越来越受到人们的关注。运动跟踪和检测的 应用广泛,在智能监控和人机交互中,如:银行、交通、超市等场合常常使用运动跟 踪分析技术,通过定位物体并对其行为进行分析,一旦发现物体有异常行为,监控系 统就发出警报,提醒人们注意并即时的处理,改善了人工监督注意力分散、反应时间 较慢、人力资源浪费等问题。运动目标的跟踪在虚拟现实、工业控制、军事设备、医 学研究、视频监控、交通流量观测监控等很多领域也有重要的实用价值。特别在军事 上,先进的武器导航、军事侦察和监控中都成功运用了自动跟踪技术。而跟踪的难点 在于如何快速而准确的在每一帧图像中实现目标定位。正因如此,对运动目标的跟踪 和检测的研究很有价值。1.2 数字图像处理技术的发展与应用数字图像处理技术是 20 世纪 60 年代随着计算机技术和 VLS I Very Large Scale ( Integration)的发展而产生、发展和不断成熟起来的一个新兴技术领域,它在理论上 和实际应用中都取得了巨大的成就。 20 世纪 20 年代,图像处理技术首次应用于改善伦敦和纽约之间海底电缆发送的 图片质量。到 20 世纪 50 年代,计算机发展到一定的水平后,数字图像处理才真正引起 人们的兴趣。1964 年美国喷气推进实验室通过计算机对“徘徊者七号”太空船发回的1 基于 VC 的运动图像跟踪算法设计大批月球照片进行处理,获得了巨大成功。20 世纪 60 年代末,数字图像处理初步具备 了比较完整的体系,形成了一门新兴的学科。20 世纪 70 年代,数字图像处理技术得到 迅猛的发展,理论和方法进一步完善,应用范围更加广泛。在这一时期,图像处理主要和 模式识别及图像理解系统的研究相联系,如文字识别、医学图像处理、遥感图像的处 理等。 世纪 70 年代后期到现在,各个应用领域对数字图像处理提出越来越高的要求, 20 促进了这门学科向更高要求的方向发展。特别是在景物理解和计算机视觉(即机器视 觉)方面,图像处理已由二维处理发展到三维理解或解释。 进入 21 世纪后, 随着计算机 技术的迅猛发展和相关理论的不断完善, 数字图像处理技术在许多应用领域受到广泛 重视并取得了重大的开拓性成就。属于这些领域的有航空航天、生物医学工程、工业 检测、机器人视觉、公安司法、军事制导、文化艺术等。该技术成为一门引人注目、 前景远大的新型学科。1.3 运动目标检测技术的研究现状由运动目标所形成的图像序列可分为两种情况: 一种是静态场景,一种是动态 场景。前一种情况通常发生在摄像机相对静止状态(如监视某一路口车流量的固定摄 像机), 后一种情况通常发生在摄像机也在相对运动状态(如装在卫星或飞机上的 监视系统)。 近几年来,研究人员提出了许多方法用于检测和跟踪序列图像中的运动目标,其 中绝大多数方法都假设用于获取序列图像的背景是静止的, 而大多数实际情况也满足 这一假设, 所以人们主要研究的是背景静止-物体运动这种情况下获取的动态序列图 像。针对这种情况,现有的运动目标检测方法主要有三类:帧差法(Temporal difference)、背景减法(Background subtraction)、光流场法(Optical flow)。 帧差法即帧间差分法,是在连续的图像序列中,提取两个或三个相邻帧,采用基 于像素的时间差分来获取图像中的运动信息。帧间差分法计算简单,对动态环境具有 较强的适应性,但不能提取出目标的所有相关点,容易在目标内部形成“空洞”,而 且要求背景绝对静止或基本无变化(噪声较小),因而适用场合有限。 背景减法也称背景差分法, 基本思想是将当前帧图像与事先存储或者实时得到的 背景图像相减, 即当前图像与已知背景图像之间的差分。 较早期的背景差分法有均值、 中值、运动平均、高斯模型方法等,随着研究的深入,逐渐出现了一些比较成熟的背 景差方法。1999 年 MIT 的 C.Stauffer 提出了基于混合高斯模型的背景差方法,针对 高斯噪声的复杂背景,采用多个高斯分布描述像素过程;2000 年 MIT 的 Oliver 等人2 沈阳航空航天大学毕业设计(论文)提出了背景特征化建模的方法。主要研究的焦点都落在了背景更新与建模方法上。从 实际应用角度来看,帧差和背景减相结合的运动检测是使用最广泛的一种方法。 Spagnol 等人提出了一种运用邻域的相关系数结合帧差和背景减来进行运动检测的方 法,该方法不仅有效地抑制了光照变化对检测结果的影响,并解决了阴影、重影和伪前 景等问题。但国内有人指出了 Spagnol 的方法的三个不足之处:①会将背景颜色一致 的区域误判为前景;②当运动目标速度缓慢或静止时,存在漏检;③在背景复杂的情 况下,背景更新策略将使背景模型退化。并且,提出了首先用灰度拉伸变换,并结合 灰度值信息来改进邻域相关系数的计算方法,以排除背景的误判;然后通过在帧差和 背景减相结合的策略中加入运动分析,用来改善运动缓慢目标的检测结果;最后在背 景复杂的情况下用运行期更新法进行背景更新,以防止背景模型的退化。 最后,光流场法是分析序列图像中运动目标的重要方法,它既可以用于运动目标 的检测,也可以用于运动目标的跟踪。所谓光流是指图像中灰度模式运动的速度;它 是景物中可见点的三维速度矢量在成像平面上的投影, 它表示了景物表面点在图像中 位置的瞬时变化;同时光流场携带了有关运动和结构的丰富信息。光流场的计算最初 是由国外两名学者提出的, 它是一种以灰度梯度基本不变或亮度恒定的约束假设为基 础的运动目标探测的有效方法。光流法能够较好的处理运动背景的情况,但计算量巨 大,难以应用到实时系统,同时对噪声比较敏感,精度较低,难以得到运动目标的精 确边界。 而张泽旭等将 Canny 边缘提取融入光流场分割技术, 对单运动目标和多运动 目标均取得了比较满意的效果,实时性也大大提高。但如何进一步提高其抗噪性、实 时性和运算速度,有待于深入研究。 总的来说,过去的二三十年中,国内外学者在运动目标检测理论及其实现方面做 了大量、 深入的研究工作, 取得了令人瞩目的成果, 并将研究的成果应用到很多领域, 如智能监控系统、军事制导等等。但是由于运动目标检测问题本身的复杂性和目前视 频技术发展水平的限制,运动目标的检测技术至今仍然处于研究和讨论阶段,到目前 为止,还没有出现能够适用于各种场合、各种情况的通用算法。现今的各种算法在稳 健性、准确性、可靠性等方面还有着这样、那样的不足。这些算法有的简单、易于实 现,实时性好,但可靠性不高,在复杂场景和运动下算法容易失效;有的虽然可靠性 较高,但算法过于复杂,不利于进行实时检测。而且,静态场景下的运动目标检测的 研究较多;而动态场景下的检测研究较少,算法还不成熟。已有的运动目标检测系统 大多受限于特定的应用场景,目标检测算法还有待于进一步研究和优化,研究一种鲁 棒性好、精确度高、性能稳定和适用性强的运动目标检测算法依然任重道远,面临巨3 基于 VC 的运动图像跟踪算法设计大挑战。1.4 本文的任务、主要内容及结构课题研究的主要任务及技术指标 主要任务: 该毕业设计的主要工作包括了解摄像头图像采集系统的工作过程, 首先实现摄像 头的数据采集过程,进而编写基于 VC 的图像处理程序,对画面中的动态物体进行识 别并用矩形方框将其标记。 技术指标: 构造出完整的基于 VC 的摄像头数据采集及运动图像跟踪系统; 实现摄像头的数 据采集过程,进而编写基于 VC 的图像处理程序,对画面中的动态物体进行识别并用 矩形方框将其标记。 本文的主要内容及结构 本文选取的运动目标检测跟踪的算法作为研究重点。 利用 OpenCV 和 Visual C++ 组建实验平台,针对数字图像特定噪声的去除、运动目标的正确识别与分割、处理的 实时性要求等难点进行了研究。 本文主要工作总结如下: 在对图像噪声的处理方面:综合使用各种方法去除图像噪声,通过实验比较了这 些方法所适用的场合。 在运动目标检测跟踪方面: 重点研究了目前在实际应用中普遍采用的以帧间差算 法。 在对检测出的变化区域进行后处理方面: 采用适当的形态学滤波处理得到更清晰、 更准确的运动目标,进而进行连通性分析,去除小面积噪声,保留足够大的目标。最 后进行区域标记,分割出完整的运动目标,加以标记。 综上,本文旨在利用现有的理论、算法和工具,以工程应用为目的,研究如何从 序列图像中检测出运动目标。 并且, 本文基于 OpenCV 这个开放的计算机视觉程序库, 通过 VC++编程环境对运动目标检测算法进行了编程实现,完成了运动目标检测系 统。 按照问题描述、 问题建模、 问题求解的思路共分六章, 主要内容及结构组织如下: 第一章 绪论。概述了课题的研究背景,主要讨论了运动目标检测技术的研究现 状、数字图像处理技术的发展与应用,阐述了论文的整体结构。4 沈阳航空航天大学毕业设计(论文)第二章 介绍研究 OpenCV 技术。 其中 OpenCV 的优势、 OpenCV 在 Visual C++6.0 下的配置方法和 OpenCV 中常用的数据结构及函数介绍。 对数据结构的必要描述为后 面函数的应用奠定了一定的理论基础。 第三章 图像预处理。 本章对图像预处理的过程进行了详细的描述。为此,我们首先要图像的提取和灰 度转换。然后图像上噪声进行研究,详细叙述了中值滤波原理,利用中值滤波去除图 像的噪声。不断进行实验,以确定较为理想的阈值。 第四章 运动目标检测。 本次课题研究运动目标跟踪算法,必然需要对其运动目标进行检测。通过讨论三 种目标检测方法,确定本次课题以帧间差法为检测方法,然后对图像进行二值化和数 学形态滤波,最后通过实验检测算法的鲁棒性。 第五章 目标跟踪算法的研究 本章首先讨论了运动目标的跟踪原理,详细描述了运动目标特征的重要作用。运 动目标的特征是一个重要的跟踪依据,在很多跟踪算法中都有目标特征提取这一环 节。所提取的目标特征必须在环境变化、目标自身变化或者运动改变时,仍然能够将 运动目标描述出来。最后详细叙述了基于团块的目标跟踪算法,包括数据的定义、模 块结构与相应函数。 第六章 程序结果演示与分析 本章将配置好的系统进行演示与分析, 系统成功的对画面中的动态物体进行识别 并用矩形方框将其标记。1.5 本章小结在本章绪论中, 主要介绍了基于 VC 的运动图像跟踪算法设计研究课题的背景知 识发展概况及其应用,阐述了运动图像跟踪算法的现实意义,总结了论文的任务、内 容与结构。5 基于 VC 的运动图像跟踪算法设计2 OpenCV 技术介绍OpenCV 提供的视觉处理算法非常丰富,并且它部分以 C 语言编写,加上其开源 的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序, 所以很多人用它来做算法的移植,OpenCV 的代码经过适当改写可以正常的运行在 DSP 系统和单片机系统中。2.1 OpenCV 简介OpenCV 是 Intel?开源计算机视觉库。它由一系列 C 函数和少量 C++类构成,实 现了图像处理和计算机视觉方面的很多通用算法。 其重要重要特性包括:拥有包括 300 多个 C 函数的跨平台的中、高层 API。它不 依赖于其它的外部库――尽管也可以使用某些外部库。 对非商业应用和商业应用都是免费(FREE)的。(细节参考 BSD license)。 为 Intel@Integrated Performance Primitives(IPP)提供了透明接口。 这意味着如果有 为特定处理器优化的的 IPP 库,OpenCV 将在运行时自动加载这些库。2.2 OpenCV 的优势1)纯 C 代码,源代码开放。开源软件之所以能够风靡世界,首先是其开源的免 费特性;此外,由于有全球众多编程者的参与,开源软件一般具有简约精炼、资源占 用少、功能集中和安全性好的优点。 2)丰富的函数功能,强大的图像和矩阵运算能力:OpenCV 提供了数组、序列、 矩阵、树等基本结构,也包含了差分方程求解、傅立叶分析、积分运算、特殊函数等 众多高级数学计算函数,以及各种图像处理操作和目标跟踪、摄像机校准、三维重建 等高级视觉函数。 3)平台无关性:基于 OpenCV 开发的程序可以直接在 Windows、Unix、Linux、 MacOSX、Solaris、HP 等平台之间相互移植,无需对代码进行任何修改。 4)方便灵活的用户接口。OpenCV 作为一个开放的计算机视觉函数库在使用上 必然没有 Matlab 那样解释执行来得方便,而 softhitegration 将 CH 和 OpenCV 绑定起 来推出的 CH OpenCV,解决了这一使用上的瓶颈。并且具有交互性、强大的扩展功6 沈阳航空航天大学毕业设计(论文)能、Web 实现性和可嵌入性等特性。2.3 OpenCV 在 Visual C++6.0 下的配置方法本文的硬件平台为普通的笔记本电脑,内存容量为 2G。视频输入有一个 USB 摄 像头。软件开发平台为 WindowsXP、OpenCV 1.0 以及 MS Visual C++6.0 (以下简称 VC6.0)。 其中 OpenCV 配置的过程如下: 假如要将 OpenCV 安装到 C:\Program Files\OpenCV,在安装 OpenCV 时选择&将 \OpenCV\bin 加入系统变量&(Add\OpenCV\bin to the systerm PATH)。然后,检查 C:\Program Files\OpenCV\bin 是否已经被加入到环境变量 PATH,如果没有,请加入。 加入后需要注销当前 Windows 用户(或重启)后重新登陆才生效。(可以在任务管理 器里重启 explorer.exe)。 在 VC6.0 下的配置步骤如下: 1)全局设置 菜单 Tools-&Options-&Directories: 先设置 lib 路径, 选择 Library files, 在下方填入路径: C:\Program Files\OpenCV\lib。图 2.1 Library files 设置然后选择 Include files,在下方填入路径:7 基于 VC 的运动图像跟踪算法设计图 2.2 Include files 设置然后选择 Source files,在下方填入路径:图 2.3 Source files 设置最后点击“OK” ,完成设置。 2)项目设置 每创建一个将要使用 OpenCV 的 VC Project,都需要给它指定需要的 lib。菜单: Project-&Settings,然后将 Setting for 选为 All Configurations,然后选择右边的 link 标 签,在 Object/library modules(对象/库模块)附加上:cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib 如果你不需要这么多 lib,你可以只添加你需要的 lib。8 沈阳航空航天大学毕业设计(论文)图2.4 项目设置2.4 OpenCV 中常用的数据结构及函数介绍2.4.1 数据结构OpenCV 设计了一些基础的数据类型和一些帮助数据类型, 在运用 OpenCV 函数 库进行编程的过程中,常常会需要用到这些结构类型,只有正真了解这些结构才能够 很好地利用 OpenCV 函数库来解决问题。 下面对几个比较常用的简单结构进行介绍。 1)CvPoint 结构 表示二维坐标系下的点,类型为整型,定义如下: typedef struct CvPoint { /* x 坐标, 通常以 0 为基点 */ /* y 坐标, 通常以 0 为基点 */ } CvP 2)CvSize 结构 CvSize 结构用来表示矩形框大小,以像素为精度,结构体中分别定义了矩形的 宽高和高度,定义如下: typedef struct Cvsize { int width; /*矩形宽度,单位为像素*/ int height; /*矩形高度,单位为像素*/ }CvS 3)IplImage 结构9 基于 VC 的运动图像跟踪算法设计OpenCV 库主要是使用“IplImage”结构体来创造和处理图像。IplImage 结构来源 于 inter 的另外一个函数库 IPL,该函数库主要是针对图像处理。定义如下: typedef struct IplImage { int nS int ID; int dataO /*IplImage 大小*/ /*版本(=0)*/ /*大多数 opencv 函数支持 1~4 个信道*/ /*像素的位深度*/ /*0:交叉存取颜色信道。1:分开的颜色信道。只有 cvCreateImage 可以创建交叉存取图像*/ /*0:顶―左结构,1:底―左结构*/ /* 图像宽像素 */ /*图像高像素*/ struct_IplROI * /*图像感兴趣区域*/ int imageS int widthS } 4)CvCapture 结构 typedef struct CvCapture CvC 结构 CvCapture 没有公共接口,它只能被用来作为视频获取函数的一个参数。 5)cvCreateVideoWriter 结构 typedef struct CvVideoWriter CvVideoW 2.4.2 常用函数 下面介绍一下 OpenCV 中常用的几个函数, 也是本系统常用的函数, 分别说明如 下。 1)cvLoadImage( ):载入图像 IplImage* cvLoadImage( const char* filename, int iscolor=CV_LOAD_IMAGE_COLOR ); filename:要被读入的文件的文件名。10int nC/*图像数据大小*/ /*排列的图像大小,以字节为单位*/ 沈阳航空航天大学毕业设计(论文)iscolor:指定读入图像的颜色和深度。指定的颜色可以将输入的图片转为3信道 (CV_LOAD_IMAGE_COLOR), 单信道 (CV_LOAD_IMAGE_GRAYSCALE), 或者保 持不变(CV_LOAD_IMAGE_ANYCOLOR)。 2)cvShowImage( ):在指定窗口中显示图像 void cvShowImage( const char* name, const CvArr* image ); name:窗口的名字。 image:被显示的图像。 3)cvCreateFileCapture( )与cvCreateCameraCapture( ) CvCapture* cvCreateFileCapture( const char* filename ); 初始化从文件中获取视频; filename:视频文件名。 函数cvCreateFileCapture给指定文件中的视频流分配和初始化CvCapture结构。当 分配的结构不再使用的时候,它应该使用cvReleaseCapture函数释放掉。 CvCapture* cvCreateCameraCapture( int index ); 初始化从摄像头中获取视频; index : 要使用的摄像头索引。 如果只有一个摄像头或者用哪个摄像头也无所谓, 那使用参数-1应该便可以。 函数cvCreateCameraCapture给从摄像头的视频流分配和初始化CvCapture结构。 释放这个结构,也要使用函数cvReleaseCapture。 4)cvQueryFrame( ):从摄像头或者文件中抓取并返回一帧 IplImage* cvQueryFrame( CvCapture* capture ); capture:视频获取结构。 函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。返回 的图像不可以被用户释放或者修改。 5)cvGetCaptureProperty( )与cvSetCaptureProperty( ) double cvGetCaptureProperty( CvCapture* capture, int property_id ); 获得摄像头或者视频文件的指定属性; capture:视频获取结构。 property_id:属性标识。可以是下面之一: CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳11 基于 VC 的运动图像跟踪算法设计CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以0为起点 CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾) CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度 CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度 CV_CAP_PROP_FPS - 帧率 CV_CAP_PROP_FOURCC - 表示codec的四个字符 CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数 int cvSetCaptureProperty( CvCapture* capture, int property_id, double value ); 设置指定视频获取的属性。目前这个函数对视频文件只支持: CV_CAP_PROP_POS_MSEC, CV_CAP_PROP_POS_FRAMES, CV_CAP_PROP_POS_AVI_RATIO; capture:视频获取结构。 property_id:属性标识。可以是下面之一: CV_CAP_PROP_POS_MSEC - 从文件开始的位置,单位为毫秒 CV_CAP_PROP_POS_FRAMES - 单位为帧数的位置(只对视频文件有效) CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾) CV_CAP_PROP_FRAME_WIDTH - 视频流的帧宽度(只对摄像头有效) CV_CAP_PROP_FRAME_HEIGHT - 视频流的帧高度(只对摄像头有效) CV_CAP_PROP_FPS - 帧率(只对摄像头有效) CV_CAP_PROP_FOURCC - 表示codec的四个字符(只对摄像头有效) value :属性的值。 6)cvCreateVideoWriter( ):创建视频写入器结构 CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 ); filename:输出视频文件名。 fourcc:四个字符用来表示压缩帧的codec 例如,CV_FOURCC(&#39;P&#39;,&#39;I&#39;,&#39;M&#39;,&#39;1&#39;)是12 沈阳航空航天大学毕业设计(论文)MPEG-1 codec,CV_FOURCC(&#39;M&#39;,&#39;J&#39;,&#39;P&#39;,&#39;G&#39;)是motion-jpeg codec等。在Win32下,如果 传入参数-1,可以从一个对话框中选择压缩方法和压缩参数。 fps:被创建视频流的帧率。 frame_size:视频流的大小。 is_color:如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只 有在Windows下支持这个标志)。 7)cvWriteFrame( ):写入一帧到一个视频文件中 int cvWriteFrame( CvVideoWriter* writer, const IplImage* image ); writer:视频写入器结构。 image:被写入的帧。2.5 本章小结本章主要介绍了 OpenCV 技术,包括 OpenCV 在 Visual C++6.0 编程环境下的配 置方法, 着重介绍了与本文工作密切相关的 OpenCV 中的数据结构和常用函数, 为后 面的系统实现打下基础。13 基于 VC 的运动图像跟踪算法设计3 图像预处理数字图像处理(Digital Image Proeessing)又称为计算机图像处理,它是指将图像信 号转换成数字信号并利用计算机对其进行处理的过程。 为了消除采集图像的噪声和干扰,加强有用信息,使图像更易于辨识。其中,处 理的重点是去除噪声,但选取怎么样的滤波器最合适则是个难题。通常图像里的噪声 类型有高斯噪声、脉冲噪声、瑞利噪声等。高斯噪声的特点是密度大、噪声强度的波 动范围宽。受高斯噪声污染的图像不仅在图像的每一像素灰度级上都受影响,而且即 便同一灰度级上造成的污染程度也可能存在着较大的差异。 图像中出现的一般为高斯 噪声。一般用平滑滤波器降低高斯噪声。3.1 图像的获取与灰度转换原始彩色图像的背景提取,基本思想是,图像中的某个像素按时间抽样,其作为 背景像素的时间比作为运动前景的时间长,即其作为背景的概率比作为前景的概率 大,而且背景和前景在颜色上和亮度上都有很大不同。这是因为,对于固定场景,运 动物体在运动,其转瞬即逝,大多数时间我们看到的都是静止背景,因此图像上某个 像素点作为前景的时间相对作为背景的时间短得多;而且,运动物体和静止背景在色 彩上有明显区别, 人能轻易分辨出前景物体, 即使在一张静止图像上。 不论何种方法, 都是基于这个思想。 利用普通的彩色CCD 摄像机拍摄的图像都可以统一规整为宽度为384,高度为 255像素(pixels)点的位图文件格式,即彩色的BMP 位图文件。BMP 格式的图像是以 象素的形式记录图像的,它的每个象素点(Pxiel)由红、绿、蓝三原色组成,每个色彩 通道的颜色值都由一个八位的字节来表示。BMP 图像文件的结构分为:文件头、调色 板数据和图像数据三个部分,其中文件头的长度固定为54个字节,文件头中包含两种 数据结构。然而,考虑到图像文件的存储量和处理图像需占用大量机器资源,本图像 识别系统均采用不含彩色信息的灰度图像, 即图像中每个象素仅由一个八位字节表示 该像素的亮度值,因而灰度图像是具有256 个灰度级的黑白图像,便于后续的图像二 值化,处理运算量大大减少。一些系统的摄像部分采用单色CCD 摄像头则可以直接 得到灰度图像。由真彩图像到灰度图像的变换,本课题用如下的变换公式:14 沈阳航空航天大学毕业设计(论文)RGB →Gray :Y = 0.212671*R + 0.715160 *G + 0.72169*B 在openCV 中,主要使用的图像格式为Ipllmage,即IpL 图像头。(3.1)其中Y 为灰度图像的灰度值,R、G、B 为真彩图像的红、绿、蓝三通道颜色值。Ipllmage 结自于 Intel Imageproeessing Library(是所具有的)。OpenCV 只支持其 中的一个子集。Ipllmgae 结构中各成员变量所代表的含义。3.1.1 图像噪声噪声主要在数字图像的获取(量化)和传输中产生,可以理解为妨碍人的视觉器官 或系统传感器对所接收图像源信息进行理解或分析的各种因素, 一般是不可预测的随 机信号,只能用概率统计的方法去认识。噪声对图像处理十分重要,影响图像处理的 输入 、采集、处理的各个环节以及输出结果的全过程。特别是图像的输入、采集噪 声的抑制是十分关键的问题,若输入伴有较大的噪声,必然影响处理全过程及输出的 结果。 因此一个良好的图像处理系统, 不论是模拟处理还是用计算机进行的数字处理, 无不把减少最前一级的噪声作为主攻目标。3.1.2 噪声的特征设图像信号为灰度图像并按二维亮度 f (x, y)分布,则噪声可看作是对亮度的干 扰,可用n(x, y)来表示。噪声是随机的,因而需用随机过程来描述,即要求知道其分 布函数和密度函数。但在许多情况下这些函数很难测出或描述,甚至不可能得到,所 以常用统计特征描述噪声,如:均值、方差、相关函数等。 用噪声平方的平均值 E[n 2 ( x, y )] (E[]表示均值操作)描述噪声的总功率;用噪声的 方差 E[(n( x, y) ? E[n( x, y )]) 2 ] 描述噪声的交流功率;用噪声平均值的平方 E 2 [n( x, y )] 表 示噪声的直流功率。3.1.3 噪声的分类根据噪声产生的来源,大致可以分为外部噪声和内部噪声两大类。 外部噪声是指从处理系统外来的影响。 如天线干扰或电磁波从电源线窜入系统的 噪声。内部噪声则有如下四种最常见形式。 1.由光和电的基本性质引起的噪声。例如电流可看作电子或空穴运动这些粒子运 动产生随机散粒噪声,导体中电子流动的热噪声,光量子运动的光量子噪声等。 2.由机械运动引起的噪声。例如,接头振动使电流不稳,磁头或磁带、磁盘抖动15 基于 VC 的运动图像跟踪算法设计等。 3.元器件噪声。如光学底片的颗粒噪声,磁带、磁盘缺陷噪声,光盘的疵点噪声 等。 4.系统内部电路的噪声。 从噪声的分类方法来看是多种多样的。但综合来说,噪声是随机产生的量,所以 又可以从统计数学的观点来定义噪声。 凡是统计特征不随时间变化的噪声称为平稳噪 声,而统计特征随时间变化的噪声称作非平稳噪声。 从噪声的分类方法来看是多种多样的。但综合来说,噪声是随机产生的量,所以 又可以从统计数学的观点来定义噪声。 凡是统计特征不随时间变化的噪声称为平稳噪 声,而统计特征随时间变化的噪声称作非平稳噪声。 而噪声反应在图片上则有高斯噪声、脉冲噪声、瑞利噪声等。 高斯噪声的特点是密度大、噪声强度的波动范围宽。受高斯噪声污染的图像不仅 在图像的每一像素灰度级上都受影响, 而且即便同一灰度级上造成的污染程度也可能 存在着较大的差异。3.2 图像滤波为了消除采集图像的噪声和干扰,加强有用信息,使图像更易于辨识,需要去除 噪声。可通过图像滤波的方法实现。 噪声信号的滤波是信号处理的基本任务之一。 过去这一任务主要由线性滤波器来 完成,但线性滤波器不能有效地抑制各种非加性高斯噪声,且不利于信号边缘等细节 特征的保持。因而,近年来的噪声信号恢复问题主要采用非线性滤波器来处理。在诸 多种类的非线性滤波器中,中值滤波器是最具代表性和很有发展前途的一种滤波器, 因为它是以排序为基础的,具有并行快速实现的特点,一直受到国内外学者的普遍关 注和广泛研究。 中值滤波器的主要功能是改变与周围象素灰度值差别比较大的象素的 值而改取与周围象素灰度值接近的值,从而消除孤立的噪声点。3.2.1 中值滤波原理中值滤波的基本思想是用象素点邻域灰度值的中值来代替该象素点的灰度值, 对 于奇数个元素,中值是指按大小排序后中间的数值;对于偶数个元素,中值是指排序 后中间两个元素灰度值的平均值。 中值滤波这种方法由于不依赖于邻域内那些与典型16 沈阳航空航天大学毕业设计(论文)值差别很大的值,因而能在去除噪声脉冲、椒盐噪声的同时又能保留图像边缘细节。 中值滤波一般采用一个含有奇数个点的滑动窗口, 具体方法为首先确定一个奇数象素 的窗口 W,窗口内各象素按灰度大小排队后,用其中间位置的灰度值代替原 f(x,y)灰 度值成为增强图像 f? (x,y),即:? f ( x, y ) ? medians ,t?S xy | g ( x, y ) |其中,W为选定窗口大小。(3.2)本文在对图像进行滤波时正是考虑了图像中多为尖峰状干扰, 中值滤波能去除点 状尖峰干扰而边缘不会变坏,若用低通滤波虽能去除噪声但陡峭的边缘将被模糊。对 于一维情况, 中值滤波器不影响阶跃函数和斜坡函数, 并可以有效地消除单、 双脉冲, 使三角函数的顶端变平;对于二维情况,中值滤波的窗口形状和尺寸对滤波器效果影 响很大。使用二维中值滤波最值得注意的是要保持图像中有效的细线状物体,如果图 像中的线、尖角细节较多,则不宜采用中值滤波。3.2.2 中值滤波特性(1)对某些输入信号中值滤波的不变性; (2)中值滤波去噪性能:可以用来减弱随机干扰和脉冲干扰。对尖峰性干扰效果 好,即保持边缘的陡度又去掉干扰,对高斯分布噪声效果差;对脉冲干扰来讲,特别 是相距较远的窄脉冲干扰,中值滤波是很有效的。图3.1 中值滤波后的图像17 基于 VC 的运动图像跟踪算法设计3.3 本章小结本章主要讨论了图像预处理的思路,先将背景图像进行灰度处理,然后分析图像 上产生的噪声,为了消除采集图像的噪声和干扰,分析与选用何种滤波器,讨论滤波 器的特性和是否满足需求。18 沈阳航空航天大学毕业设计(论文)4 运动目标检测运动目标检测处于整个视频监视系统的最底层,是各种后续高级应用如目标跟 踪、 目标分类、 目标行为理解等的基础。 运动目标检测是指从视频流中实时提取目标, 一般是确定目标所在区域和颜色特征等。运动目标检测的结果是一种“静态”目标一 一前景目标,由一些静态特征所描述。运动目标检测依据前景目标所处的背景环境, 可以划分为两类一一静态背景下运动目标检测和动态背景下运动目标检测, 本章结合 论文的工作实际主要研究摄像机不发生运动的静态背景运动目标检测算法。 相对于静止信息来说,运动信息更能引起人们的注意,也更加有用。例如,对于 自动视频监控系统,监控对象的变化也是它更感兴趣的信息。自动视频监控系统是利 用摄像机采集到的图像序列对监控的对象进行不间断监视,如出现异常情况,给出报 警信号,通知有关人员进行及时处理。为了对监控对象的变化进行检测,系统要对采 集得到的图像序列进行有效地处理,从中分离出变化信息,对于一般场合变化信息就 是目标的运动。 目前,检测运动目标的方法主要有光流法和帧间差阈值法。由于噪声、多光源、 阴影、透明性和遮挡性等原因,使得计算出的光流场分布不是十分可靠和精确,光流 场的计算实时性和实用性较差。帧间差阈值法速度快,易于硬件实现。不足之处是很 难求出运动物体的速度,且当运动物体在成像平面有重迭时,帧间差阈值法不适用。 本文使用图像背景差分的方法来对序列图像中的运动目标进行检测。4.1 运动目标检测的基本方法目标检测与提取在目标跟踪应用中有着重要的地位。 目标检测与提取的准确性直 接影响到跟踪的结果和精度。一个好的运动目标检测算法,应该能适用于所监视的各 种环境,通常一个优秀的运动目标检测算法应具有以下的特征: 1 不依赖于摄像头的安装位置; 2 在各种天气条件下应是鲁棒的; 3 对环境光线的变化应是鲁棒的; 4 应能够处理杂乱无章的大面积区域的各种运动,以及视场内目标的叠加;19 基于 VC 的运动图像跟踪算法设计5 能适应场景中个别物体运动的干扰,如树木的摇晃,水面的波动; 人们总是希望能有一个能适用于监视各种各样环境, 能够满足各种要求以及普遍 适用的一个运动目标检测算法,但是实际应用中要达到这样的要求是十分困难的,因 为实际应用中不但要考虑到算法要尽量适用于多种环境, 而且一般还要在算法的复杂 度、可靠性,以及实时性等诸多方面中考虑。 通常情况下, 运动目标检测的算法可以按照被监视场景是室内还是室外分为室内 监测算法和室外监测算法,也可以按照算法具体使用的方法分为连续帧间差分法、背 景差分法和光流法。4.1.1 帧间差分法对于许多应用来说,检测图像序列中连续帧图像的差异是非常重要的步骤。场景 中任何可观察的运动都会体现在场景图像序列的变化上,如果能检测这种变化,就可 以分析其运动特性。进一步,如果目标的运动限制在平行于图像平面的一个平面上, 则可以得到目标运动特性定量参数的很好估计。图4.1 相邻两帧图像差分法基本原理流程连续帧间差分法可分为相邻两帧图像差分和连续三帧图像差分, 这里主要介绍相 邻两帧图像差分法。相邻两帧图像差分法的基本运算过程如图(4.1)。首先,利用公式 (4.1)计算第 k 帧图像与第 k ?1 帧图像之间的差别,得到差分后的图像 ,然后对差 分后图 像使用图像分割算法―式(4.2)进行二值化处理, 即认为当差分图像中某一像 素的差 大于设定的闭值时,则认为该像素是前景像素(检测到的目标),反之则认为 是背景像素。在对差分图像 后得到图像凡,最后对 二值化后还可以使用数学形态学对其进行滤波处理,然 图像进行区域连通性分析,当某一连通的区域的面积大于某一给定闭值,则成为检测目标,并认为该区域就是目标的区域范围,就可以确定目20 沈阳航空航天大学毕业设计(论文)标的最小外接矩形。Dk ( x, y) ?| f k ( x, y ) ? f k ?1 ( x, y ) |其中 f k ( x, y ) , f k ?1 ( x, y) 为连续两帧图像; Dk ( x, y ) 为帧差图像。?0 Dx ( x, y ) ? T Rk ( x, y ) ? ? ?1 Dx ( x, y ) ? T(4.1)(4.2)其中 T 是二值化设定阀值。 基于连续帧间差分法的运动目标检测其主要优点是: 1 算法实现简单。 2 程序设计复杂度低。 3 易于实现实时监视。 4 由于相邻帧的时间间隔较短,因此该方法对场景光线的变化不太敏感,受目标 阴影的影响也不太大,可以讲连续帧间差分法对动态环境有较好的适应性。 然而,这种方法在使用过程中还存在两个问题:一是两帧间目标的重叠部分不容 易检测出来,即只能检测出目标的一部分:二是检测出目标在两帧中变化的信息,这 样会存在较多的伪目标点,检测出的目标要比实际的目标大一些。分析原因,前者是 由于我们直接用相邻的两帧相减后,保留下来的部分是两帧中相对变化的部分,因此 两帧间目标的重叠部分不容易被检测出来;后者是由于相邻两帧必然存在的灰度变化 所产生的。4.1.2 背景差法其原理如下图所示图4.2 背景差分法原理流程 21 基于 VC 的运动图像跟踪算法设计基于背景差分方法的原理非常简单,其基本运算过程如图(4.2)所示:先利用公式 (4.3)计算背景图像 fbk 与当前帧图像 fk 的差,然后依据公式(4.4)对差分图像 Dk 进行二 值化和形态学滤波处理,并对所得结果 Rk 进行区域连通性分析,当某一连通的区域 的面积大于某一给定阈值,则成为检测目标,并认为该区域就是目标的区域范围,就 可以确定目标的最小外接矩形。Dk ( x, y ) ?| f k ( x, y ) ? fbk ( x, y ) |其中 fk(x,y) 、fbk(x,y)为连续两帧图像, Dk(x,y)为帧差图像。(4.3)?0 Dx ( x, y ) ? T Rk ( x, y ) ? ? ?1 Dx ( x, y ) ? T其中 T 是二值化设定阀值。 此方法的主要特点是: 1 要求使用当前被监视环境中的一幅静态背景图像;(4.4)2 利用背景图像与当前帧图像的差进行运动目标检测;在确定了比例参数后调解 积分参数,最后调节微分参数。4.1.3 光流法光流是指图像亮度模式的表观(或视在)运动。使用“表观运动”的主要原因是光 流无法有运动图像的局部信息唯一的确定,例如,亮度比较均匀的区域或亮度等值线 上的点都无法唯一的确定其点的运动对应性,但是运动是可以观察到的。这就说明了 光流与运动场不一定是唯一对应的,即有光流不一定就是物体运动产生的,反之物体 发生了运动也不一定会产生光流。但一般情况下,可以认为光流与运动场没有太大区 别,因此就可以根据图运动估计相对运动。由于实时性和实用性都比较差,所以不采 用,也就不多做介绍了。4.2 本文采用的算法设计鉴于背景差分法和帧间差分法的优缺点,我们将这两种方法结合起来,使它们优 势互补,从而克服相互的弱点,提高运动检测的效果。但是在实际的场景中,即便是 室内环境,也存在光线等各种变化造成的干扰,或者人为造成的开灯等光线的强烈变22 沈阳航空航天大学毕业设计(论文)化。所以在背景差分法的实现中,它的固定背景不能一成不变。如果不进行重新初始 化,错误的检测结果将随时间不断累计,造成恶性循环,从而造成监控失效。因此, 我们在提出检测算法的同时,要建立背景更新模型。保证背景图像能随着光线的变化 而变化,确保检测的准确性。4.2.1 新算法思想在视频图像序列中,利用已有的背景差分法和帧间差分法作为启示,将动态图像 中连续两帧差图像和背景差图像直接进行与操作, 再将结果进行二值化处理得到运动 结果。这样就达到了加大目标信息的权重,同时抑制了静态背景的效果,得到的运动 检测图像包含了更多日标的信息, 不仅包含目标轮廓而且还有目标轮廓内的目标相关 点,从而将运动目标从背景图像中分离出来,最终得到视频序列图像中运动存在与否 的二值化图像。4.2.2 算法描述(l)、对序列图像进行 3× 中值滤波预处理,去掉图像随机噪声。减少以后运算 3 的复杂度,克服噪声对图像处理结果的干扰。 (2)、从视频图像序列中选取出背景图像 Bk(x,y),使其只包含固定的背景图像; (3)、在视频图像序列中选取连续的两帧图像,其中前一帧图像 Pk-1(x,y),当前 帧图像 Pk(x,y); (4)、计算当前帧与背景帧的差得 FD(x,y),从 图像中提取出完整的目标; (5)、计算当前 1 帧的差得 FG(x,y),得到目标的变化量; (6)、求帧差 FD(x,y)与,FG(x,y)的交集得到运动目标粗糙的运动区域图像; (7)、数学形态学运算使得运动区域封闭、连续、完整,并去掉背景中的噪声。 其中:?1 FD ( x, y ) ? ? ?0 ?1 FG ( x, y ) ? ? ?0| Pk ( x, y ) ? Bk ( x, y ) |? T | Pk ( x, y ) ? Bk ( x, y ) |? T | Pk ( x, y ) ? Pk ?1 ( x, y ) |? T | Pk ( x, y ) ? Pk ?1 ( x, y ) |? T(4.6) (4.5)23 基于 VC 的运动图像跟踪算法设计上式中,T 为阈值。对于给定视频序列的图像.假设像素点 k 处没有运动,其帧 差 dk 服从均值为 0,方差为 ? 2 的 Gauss 分布 N(0, ? 2 ):P(d k | H 0 ) ? 1 2?? 2 exp( ? d k2 ) 2? 2(4.7)上式中表示无运动假设, ? 2 是帧差的统计方差,通常认为它等于摄像机噪声方差的两倍。根据概率统计学假设检验“3 ? ”法则,并依据“正确的阈值 T 应该能 消除大部分噪声”的原则。由试验测试得阈值 T 在本文特定的应用背景下可以选在 5~15 之间。4.3 图像的二值化要从图像中分离出对象物,得把图形(对象物)和其背景作为二值图像对待。 图像的二值化处理就是讲图像上的点的灰度置为 0 或 255,也就是讲整个图像呈 现出明显的黑白效果。 即将 256 个亮度等级的灰度图像通过适当的阀值选取而获得仍 然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非 常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很 多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像, 这样子有利于再对图像做进一步处理时, 图像的集合性质只与像素值为 0 或 255 的点 的位置有关, 不再涉及像素的多级值, 使处理变得简单, 而且数据的处理和压缩量小。 为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度 大于或等于阀值的像素被判定为属于特定物体,其灰度值为 255 表示,否则这些像素 点被排除在物体区域以外,灰度值为 0,表示背景或者例外的物体区域。如果某特定 物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景 下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值 上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技 术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结 果。24 沈阳航空航天大学毕业设计(论文)图4.3 图像的二值化4.4 数学形态学滤波为了解决阈值分割后的差分图像可能会存在的一些目标空洞和少孤立噪声的问 题, 使用了数学形态学图像处理。 形态学一般指生物学究动物和植物结构的一个分支, 后来人们用数学形态学表示以形态为对图像进行分析的数学工具。 数学形态学的基本 思想是用具有一定形态结构元素去度量和提取图像中的对应形状以达到对图像分析 和识别的。 该技术一般以二值图像为处理对象,但也可以用在某些灰度图像用中。 形态学运算主要用于如下几个目的: 1 图像预处理(去噪声、简化形状) 2 增强物体结构(抽取骨骼、细化、粗化、凸包、物体标记) 3 从背景中分割物体 4 物体量化描述(面积、周长、投影、Euler-poineare 特征) 黑白点的集合构成了二值图像的描述。假定只考虑黑色像素,其分认为是背景。 基本的形态学变换是膨胀和腐蚀,由这两个变换可以更多的形态学运算,如开运算、 闭运算和形状分解,等等。25 基于 VC 的运动图像跟踪算法设计4.4.1 腐蚀与膨胀数学形态学中二值图像的形态变换是一种针对集合的处理过程。 其形态算子的实 质是表达物体或形状的集合与结构元素间的相互作用, 结构元素的形状就决定了这种 运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后 将结构元素与下面的二值图像进行交、并等集合运算。 基本的形态运算是腐蚀和膨胀。 在形态学中,结构元素是最重要最基本的概念。结构元素在形态变换中的作用相 当于信号处理中的“滤波窗口”。用 B(x)代表结构元素,对工作空间 E 中的每一 点 x。 腐蚀定义为:X ? E ? B{X : B( X ) ? E}(4.8)上式表明 E 用 B 腐蚀的结果是所有 x 的集合,其中 B 平移 X 后仍在 E 中。换句 话说,用 E 来腐蚀 A 得到的集合是 B 完全包含在 E 中时 B 的原点位置的集合。 对图像进行腐蚀运算的作用是消除物体边界点。 腐蚀可以把小于结构元素的物体 去掉。另外,如果两个物体之间有细小的连通,那么选择适当的结构元素,通过腐蚀 运算就可以把两个物体分开。 膨胀定义为:Y ? E ? B{Y : B(Y ) ? E ? ?}(4.9)上式表明用 B 膨胀 E 的过程是,先对 B 做关于原点的映射,再将其映象平移 x, 这里 E 与 B 映象的交集不为空集。 膨胀运算的作用是把图像周围的背景点合并到物体中。 如果两个物体之间的距离 比较近,那么膨胀运算可能会使两个物体连通在一起。膨胀对填补图象分割后物体中 的空洞很有用。 用 B(x)对 E 进行腐蚀的结果就是把结构元素 B 平移后使 B 包含于 E 的所有点 构成的集合。用 B(x)对 E 进行膨胀的结果就是把结构元素 B 平移后使 B 与 E 的交 集非空的点构成的集合。4.4.2 开运算和闭运算膨胀和腐蚀并不是互为逆运算,所以它们可以级连结合使用。例如,可先对图像 进行腐蚀然后膨胀其结果,或先对图像进行膨胀然后腐蚀其结果(使用同一个结构元26 沈阳航空航天大学毕业设计(论文)素)。 先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平 滑较大物体边界的作用。 先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和 平滑边界的作用。 实验结果:图4.4 膨胀与腐蚀的实验结果可见, 二值形态膨胀与腐蚀可转化为集合的逻辑运算, 算法简单, 适于并行处理, 且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状 分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的, 对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状 选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实 际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测 算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线 段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法, 用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相 容性,适于对形状进行分析和描述。27 基于 VC 的运动图像跟踪算法设计4.5 目标检测试验与结果分析对比几种运动目标检测的基本方法,这里选取帧间法来检测运动目标,在经过图 像二值化将运动目标提取出来,在经形态学滤波处理改善提取效果。就可以得到运动 目标的方位和大小。图4.5 帧间差法运动目标检测演示由此可以看出, 通过合理的快速的算法实现, 该方法在应用中取得了很好的效果。 首先分析序列图像的差分图像的统计特性,自适应对图像进行二值化处理,去除 了背景,突出其中的运动目标,以此为基础,结合数学形态学和面积阈值的方法,消 除了干扰和背景中可能存在的周期性运动物体所带来的噪声, 最后分割出目标的运动 区域,通过分析差分图像的投影图,在较短几帧内从图像序列检测出运动目标,定位 目标的位置。28 沈阳航空航天大学毕业设计(论文)4.6 本章小结本章介绍了差分法识别目标的具体过程及实现流程,主要内容为利用 VC++6.0 实现从序列帧中对检测出运动的目标。详细介绍了识别过程中用到的图像的二值化、 帧间法、形态学滤波等理论基础,并给出了部分处理过程的结果图。29 基于 VC 的运动图像跟踪算法设计5 目标跟踪算法的研究目标跟踪是在事先不了解目标运动信息的条件下, 通过来自信息源的数据实时估 计出目标的运动状态,从而实现对目标的位置和运动趋势的判定。运动目标的跟踪问 题是一个复杂的估计问题。 开始主要是用于军事研究, 是精确武器制导中的关键技术。 目前,随着图像跟踪技术研究的深入,图像跟踪的应用已渗透到诸如视觉监控、医学 诊断等越来越多的领域。研究一种鲁棒性好、精确度高、性能稳定和适用性强的目标 跟踪方法依然面临巨大挑战,并且具有重要的理论意义和实用价值。5.1 运动目标的跟踪原理目标跟踪即等价于在连续的图像帧间创建基于位置、速度、形状、纹理、色彩等 有关特征的对应匹配问题。5.2 运动目标特征运动目标的特征是一个重要的跟踪依据, 在很多跟踪算法中都有目标特征提取这 一环节。所提取的目标特征必须在环境变化、目标自身变化或者运动改变时,仍然能 够将运动目标描述出来。 图像目标的特征大致分为: ① 像的视觉特征,如图像的轮廓、边缘、形状、纹理和区域等特征; ② 图像的统计特征,如颜色直方图、各种不变矩等特征; ③ 图像变换系数特征,如傅立叶描述子、小波变换系数和自回归模型等特征; ④ 图像的代数特征,如图像矩阵的奇异值分解等。 图像的边缘是图像的最基本特征。所谓边缘(或边沿)是指其周围像素灰度有阶跃 变化或屋顶变化的那些像素的集合。边缘广泛存在于物体与背景之间、物体与物体之 间、基元与基元之间。图像中的边缘通常与图像亮度的不连续性或图像亮度的一阶导 数的不连续性有关。 图像亮度的不连续性可分为: 1、 阶跃不连连续,即图像亮度在不连续处的两边的像素灰度值有着显著差异;30 沈阳航空航天大学毕业设计(论文)2、线条不连续,即图像亮度突然从一个值变化到另一个值,保持一个较小的行 程后又返回到原来的值。实际中,阶跃边缘将变成斜坡型边缘,线条边缘将变成屋顶 型边缘。 轮廓(contour)是指将检测到的边缘连接起来,而形成的封闭的或非封闭的轮廓。 封闭的轮廓对应于区域的边界,而区域内的像素可以通过填充算法来填满,断开的轮 廓可能是区域边界的一部分,也可能是图像的线条特征,如手写体笔画、图画中的线 条等。轮廓可以用边缘有序表或曲线来表示,其中曲线被称为轮廓的数学模型,包括 线段、二次曲线、三次样条曲线等。 轮廓的表示要求: 1、轮廓应该是一种简洁的表示; 2、轮廓应能精确的逼近图像特征; 3、轮廓应适合于后处理阶段的计算。5.3 图像匹配法通过图像匹配法可以识别待跟踪的运动目标并且确定其相对位置。早在上世纪 50 年代末期,欧洲 MACE 巡航导弹就已开始采用图像匹配技术作地形匹配制导。 相关跟踪是根据测量两幅图像之间的相关度函数去计算目标的位置变化, 跟踪点 就是两个图像匹配最好的位置,即相关函数的峰值。在相关跟踪的误差信号处理中, 对相关度的取值有一定的要求, 相关跟踪系统对与选定的跟踪目标图像不相似的其它 一切景物都不敏感,所以它有较好的选择跟踪能力和抗背景干扰能力。相关跟踪是把 一个预先存储的目标图像样板作为识别和测定目标位置的依据, 用目标样板与实时目 标图像的各个子区域图像进行比较(算出相关函数值),找出和目标样板最相似的一个 子图像位置,就认为是当前目标的位置,这就是相关跟踪的基本思想,这种方法也叫 做 “图像匹配” 它的基本原则就是通过相关函数的计算来找到待跟踪目标及其位置。 。5.4 基于团块的目标跟踪基于团块(blob)的跟踪算法基本原则是对候选像素进行图像分割,判断该像素是 属于目标还是属于背景或者属于其他的区域。 基于团块的跟踪算法也可以称为基于图 像分割的跟踪,因为它和图像分割所使用的基本方法是一致的,都是根据给定线索优 化像素的选择、合并和分离,都把具有相同特征的像素点集合成一个区域。它与传统31 基于 VC 的运动图像跟踪算法设计的图像分割的不同在于:目标视觉跟踪的目的是在图像序列中进行目标定位,可以有 一定程度的像素分类不准确,只需分割结果足可区分目标和背景,而传统的图像分割 算法需要精确显示目标轮廓。分割线索一般有目标的运动特征、纹理特征和图像深度 信息等。 这里提到了团块的概念,在 OpenCV 中团块的数据结构定义如下: CvBlob 结构描述团块的位置,大小和标识符(ID)。x 和 y 分别是团块位置的 横坐标和纵坐标,w 和 h 分别是团块的宽度和高度,ID 是团块的标识符,用于区分 不同的团块。 typedef struct CvBlob { float float int x,y; w,h; ID; /* 团块位置 */ /* 团块大小 */ /* 团块ID */}CvBlob; CvBlobSeq 类用来表示一系列团块。这些团块的集合可以是运动轨迹,或当前帧 中的所有团块。所以些列表是一个具有索引的数组,该数组里的每个元素可以通过关 键值(key)来访问。这个类还提供一些操作函数,用来方便地添加和删除团块。 class CvBlobSeq { public; CvBlobSeq(int BlobSize=sizeof(CvBlob)); virtual~CvBlobSeq(); virtual CvBlob * GetBlob(int BlobIndex); /* 根据索引获取团块 */ /* 根据索引删除团块 */ /* 根据团块ID删除团块 */ /* 清除所有团块 */ /* 添加一个团块 */ /* 获取团块数目 */ virtual CvBlob * GetBlobByID(int BlobID); /* 根据团块ID获取团块 */ virtual void DelBlob(int BlobIndex); virtual void DelBlobByID(int BlobID); virtual void Clear(); virtual void AddBlob(CvBlob * pB); virtual int GetBlobNum(); };32 沈阳航空航天大学毕业设计(论文)CvFGDetector是一个虚类,描述了前景检测模块的接口。具体的前景检测算法在 文件cvaux/src/vs/bgfg_estimation.cpp中实现。如果想创建一个自己的前景检测类,需 要首先创建一个CvFGDetector的子类,然后CvFGDetector中的所有虚函数。 前景检测模块的输入数据为当前帧图像, 输出数据为当前帧的前景掩码 (mask) , 其结构如图5.1所示。视频帧 前景检测模块 图5.1 前景检测模块结构 前景掩码前景检测模块将当前帧上的像素分为前景像素和背景像素。 例如运动的物体 (人) 被认为是前景,而视频中不动的部分都被当做背景区域。前景掩码通过函数GetMask 获得。所有函数必须在子类中被重载,同时也需要重写新类的创建函数。 新团块检测模块的输入数据为当前帧的前景掩码和已有的团块, 输出数据为新检 测到的团块。此模块结构如图5.2所示。前景掩码 新团块检测模块 视频帧 图5.2 新团块检测模块结构 新 团 块 (pos,size)团块跟踪模块的输入数据为当前帧 (是RGR图像) 当前帧的前景掩码和新团块, 、 输出数据为当前帧的团块信息(ID,pos,size)。此模块的结构如图5.3所示。新团块位置 前景掩码 视频帧 图5.3 团块跟踪模块结构团块 (ID,pos,size) 团块跟踪模块新检测到的团块需要加入到团块跟踪模块列表 cvblobTrackerList中, CvBlobTrackerList是团块跟踪模块的一个实现,是CvBlobTracker的一个子类,是一个 外壳(shell)模块。此模块的目的是简化团块跟踪模块的创建。创建此类的函数 cvCreateBlobTrackerList只有一个参数,该参数是一个更简单的团块跟踪器 CvBlobTrackerOne。CvBlobTrackerOne只实现一个团块的跟踪功能。33 基于 VC 的运动图像跟踪算法设计CvCreateBlobTrackerList的函数原型如下。 CvBlobTracker * cvCreateBlobTrackerList(CvBlobTrackerOne * (*create)()); 所以,CvBlobTrackerList与CvBlobTrackerOne的关系如图5.4所示。团块跟踪列表 团块 (pos,size) BlobTrackerOne 跟踪团块 1 团块 (pos,size) 团块 (ID, pos, size)团块 (ID,pos,size)团块 (pos,size)BlobTrackerOne 跟踪团块 N 图5.4 团块跟踪列表团块 (pos,size)5.5 本章小结在本章中首先介绍了运动物体的目标特征, 对几种比较常见的的目标跟踪算法进 行比较,重点描述了团块跟踪算法,并给出部分流程图与核心代码。 总的说来, 运动目标跟踪的难点在于如何快速而可靠地从一帧图像到另一帧图像 中匹配目标。 只有快速才能保证跟踪的实时性, 而可靠性则是目标跟踪最基本的要求。 因此如何选取目标的特征信息,并且在可靠的前提下简化运算是目标跟踪的关键。34 沈阳航空航天大学毕业设计(论文)6 程序结果演示与分析本文的硬件平台为普通的笔记本电脑,内存容量为 2G。视频输入有一个 USB 摄 像头。软件开发平台为 WindowsXP、OpenCV 1.0 以及 MS Visual C++6.0 (以下简称 VC6.0)。6.1 运动目标检测与跟踪演示本实验是在学校寝室内,固定好摄像头,连接摄像头后,打开运行程序可以得到 如图所示的结果图6.1 运动目标检测与跟踪演示图 135 基于 VC 的运动图像跟踪算法设计图6.2 运动目标检测与跟踪演示图 2图6.3 运动目标检测与跟踪演示图 3 36 沈阳航空航天大学毕业设计(论文)6.2 本章小结在本章中,主要是将OPENCV进行配置,与摄像头连接,固定在合适的地方后, 运行系统。系统成功的对画面中的动态物体进行识别并用矩形方框将其标记,但是出 现由于多人距离相近识别成一个运动目标的情况,仍需进一步提高。37 基于 VC 的运动图像跟踪算法设计结论随着计算机视觉在军事领域、交通智能监控领域的发展,视频的运动目标检测及 跟踪必然会得到越来越广泛的应用和发展。本论文历时四个月年,主要研究的是应用 OpenCV 实现运动目标的检测和跟踪,实验结果表明系统具有良好的鲁棒性和精确 度,达到了毕业设计的预期目标,结合工作中的问题和实际应用,论文主要完成了以 下几个方面的工作: 1.OPENCV 平台的配置与函数的学习 阐述了课题的研究背景和研究意义,并说明了当前研究的难点,以及本课题所要 解决的问题和创新点。 本文以 VC6.0 为平台, 通过调用 OPENCV 函数进行算法设计。 首先正确配置 OPENCV 平台,介绍了 OpenCV 函数库,并实现实验平台的搭建。提 取单帧视频图像,采用各种算法对其进行图像预处理,并对处理效果进行分析比较。 2.运动目标检测与跟踪方面 在运动目标检测跟踪方面: 重点研究了目前在实际应用中普遍采用的以帧间差算 法。 在对检测出的变化区域进行后处理方面: 采用适当的形态学滤波处理得到更清晰、 更准确的运动目标,进而进行连通性分析,去除小面积噪声,保留足够大的目标。最 后进行区域标记,分割出完整的运动目标,加以标记。 3.系统实验测试 在软件的设计和实现过程中,对多种设计方案和算法进行编程实现,经过多次测 试,性能稳定,运行良好。分析并改进了目前较常用的图像预处理、分割、特征提取、 图像识别与跟踪算法,并对每一个模块进行了详细的论述和设计。 这就是本次课题研究达到的目标。总的来说,本次毕业设计基本上完成了课题要 求。实现摄像头的数据采集过程,进而编写基于 VC 的图像处理程序,对画面中的动 态物体进行识别并用矩形方框将其标记。 如何提高目标识别与跟踪算法的精度、 速度及抗干扰能力是实时图像目标}

我要回帖

更多关于 cad线段端点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信