系统详细设计_第1页
系统详细设计_第2页
系统详细设计_第3页
系统详细设计_第4页
系统详细设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、系统详细设计说明书杨后超1. 引言1.1 编写目的本报告根据交通部门实时的对道路车流量的统计的要求,对系统如何实现功能如何划分做了概要性的说明。通过该报告能够使详细设计人员和开发人员了解本系统的体系结构,技术方案,软件的功能能结构,各业务间的数据接口,数据库结构等,并对整个系统的功能实现按照功能模块进行了较为详细的规划和描述,为下一步的开发任务指明方向,提出了纲要。1.2 参考资料【1】城市道路车流量检测技术及其应用研究_颜李【2】 基于视频的车流量检测技术研究_吴志伟【3】 运动车辆视频检测与车流量检测方法的研究_墨芹2. 设计概述本系统采用结构化设计的方法来实现系统总体功能,提高系统的各项

2、指标,即将整个系统合理的划分成各个功能模块,正确地处理模块之间和模块内部的联系以及和数据库的联系,定义各模块的内部结构,通过对模块的设计和模块之间关系的系统来实现整个系统的功能。2.1 限制和约束开发过程中最为重要的里程碑如下表:时间段里程碑9月项目启动、需求分析10月上半月系统的概要设计、系统详细设计10月到十二月完成白天黑夜流量统计系统1月上半月完成各种噪声所带来的对检测、识别的影响。1月下半月测试、部署在以上这些条件下,系统要实现的目标是:目的是实现系统的总体设计,明确系统的总体结构和数据结构,即划分出系统的功能模块,设计出系统的数据库数据结构,为下一步的对每个模块进行设计的详细设计工作

3、提供依据,同时为系统的测试、修改和维护提供依据。2.2 设计原则和设计要求一设计原则(1). 独立性每个模块只涉及软件要求的具体子功能(2). 易维护性基于MFC开发,采用统一的编码规则和注释,便于系统开发和维护(3). 可扩展性考虑到用户需求的多变性,采用易于扩展的软件架构,便于软件升级二 设计要求l 需求规定:1.系统打开视频序列界面:2.人工划定感兴趣的区域(ROI):3.模式选择(白天和黑夜):4.跟踪界面:5.流量统计界面:3系统的软件构架开始总系统构架: 视频采集灰度化、平滑去噪等确定ROI同时判断 白天检测模式 夜间检测模式 车流量统计4.系统主要模块功能以及代码白天车流量统计:

4、void CCarTrackSystemDlg:Nightupdate_mhi( IplImage* img, IplImage* dst, int diff_threshold ) / 夜间开始 / double timestamp = clock()/1000.; CvSize size = cvSize(img->width,img->height); int i, idx1 = last, idx2; IplImage* silh; CvSeq* seq; CvRect comp_rect; double count; double angle; CvPoint cente

5、r; double magnitude; CvScalar color; if( !mhi | mhi->width != size.width | mhi->height != size.height ) if( buf = 0 ) buf = (IplImage*)malloc(N*sizeof(buf0); memset( buf, 0, N*sizeof(buf0); for( i = 0; i < N; i+ ) cvReleaseImage( &bufi ); bufi = cvCreateImage( size, IPL_DEPTH_8U, 1 ); c

6、vZero( bufi ); cvReleaseImage( & mhi ); cvReleaseImage( & orient ); cvReleaseImage( & segmask ); cvReleaseImage( & mask ); mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 ); cvZero( mhi ); orient = cvCreateImage( size, IPL_DEPTH_32F, 1 ); segmask = cvCreateImage( size, IPL_DEPTH_32F, 1 )

7、; mask = cvCreateImage( size, IPL_DEPTH_8U, 1 ); cvCvtColor( img, buflast, CV_BGR2GRAY ); / “灰度” idx2 = (last + 1) % N; last = idx2; silh = bufidx2; cvAbsDiff( bufidx1, bufidx2, silh ); cvThreshold( silh, silh, diff_threshold, 1, CV_THRESH_BINARY ); cvUpdateMotionHistory( silh, mhi, timestamp, MHI_D

8、URATION ); / 更新 MHI cvCvtScale( mhi, mask, 255./MHI_DURATION, (MHI_DURATION - timestamp)*255./MHI_DURATION ); cvZero( dst ); cvCvtPlaneToPix(mask, 0, 0, 0, dst ); cvCalcMotionGradient( mhi, mask, orient, MAX_TIME_DELTA, MIN_TIME_DELTA, 3 ); if( !storage ) storage = cvCreateMemStorage(0); else cvClea

9、rMemStorage(storage); / 运动分割 seq = cvSegmentMotion( mhi, segmask, storage, timestamp, MAX_TIME_DELTA ); for( i = 0; i < seq->total; i+ ) if( i < 0 ) / 对整幅图像操作 comp_rect = cvRect( 0, 0, size.width, size.height ); color = CV_RGB(255,255,255); magnitude = 100; / 画线长度以及圆半径的大小控制 else comp_rect =

10、 (CvConnectedComp*)cvGetSeqElem( seq, i )->rect;/ 去掉小的部分if( comp_rect.width + comp_rect.height < 100 ) continue; color = CV_RGB(255,0,0); / red色 magnitude = 30; /if(seq->total > 0) MessageBox(NULL,"Motion Detected",NULL,0); / 感性区域 cvSetImageROI( silh, comp_rect ); cvSetImageROI

11、( mhi, comp_rect ); cvSetImageROI( orient, comp_rect ); cvSetImageROI( mask, comp_rect ); angle = cvCalcGlobalOrientation( orient, mask, mhi, timestamp, MHI_DURATION); angle = 360.0 - angle; / 在轮廓内计算点数 count = cvNorm( silh, 0, CV_L1, 0 ); cvResetImageROI( mhi ); cvResetImageROI( orient ); cvResetIma

12、geROI( mask ); cvResetImageROI( silh ); if( count < comp_rect.width*comp_rect.height * 0.05 ) continue; center = cvPoint( (comp_rect.x + comp_rect.width/2), (comp_rect.y + comp_rect.height/2) ); cvCircle( dst, center, cvRound(magnitude*1.2), color, 3, CV_AA, 0 ); cvLine( dst, center, cvPoint( cvR

13、ound( center.x + magnitude*cos(angle*CV_PI/180), cvRound( center.y - magnitude*sin(angle*CV_PI/180), color, 3, CV_AA, 0 ); / 结束 /:夜间车流量统计: void CCarTrackSystemDlg:update_mhi( IplImage* img, IplImage* dst, int diff_threshold ) double timestamp = clock()/100.; / get current time in seconds 时间戳 CvSize

14、size = cvSize(img->width,img->height); CvPoint pt3,pt4;CvRect bndRect=cvRect(0,0,0,0);/用cvBoundingRect画出外接矩形时需要的矩形CvFont font1;/初始化字体格式int linetype=CV_AA; / get current frame size,得到当前帧的尺寸 int idx1, idx2; IplImage* silh; IplImage* pyr = cvCreateImage( cvSize(size.width & -2)/2, (size.heigh

15、t & -2)/2), 8, 1 ); CvMemStorage *stor; CvSeq *cont; /*先进行数据的初始化*/ if( !mhi | mhi->width != size.width | mhi->height != size.height ) if( buf = 0 ) /若尚没有初始化则分配内存给他 buf = (IplImage*)malloc(N*sizeof(buf0); memset( buf, 0, N*sizeof(buf0); for(int i = 0; i < N; i+ ) cvReleaseImage( &buf

16、i ); bufi = cvCreateImage( size, IPL_DEPTH_8U, 1 ); cvZero( bufi );/ clear Buffer Frame at the beginning cvReleaseImage( &mhi ); mhi = cvCreateImage( size, IPL_DEPTH_32F, 1 ); cvZero( mhi ); / clear MHI at the beginning / end of if(mhi) /*将当前要处理的帧转化为灰度放到buffer的最后一帧中*/ cvCvtColor( img, buflast, C

17、V_BGR2GRAY ); / convert frame to grayscale idx1 = last; idx2 = (last + 1) % N; / index of (last - (N-1)th frame last = idx2; / 做帧差 silh = bufidx2;/差值的指向idx2 |idx2-idx1|->idx2(<-silh) cvAbsDiff( bufidx1, bufidx2, silh ); / get difference between frames / 对差图像做二值化 cvThreshold( silh, silh, 30, 25

18、5, CV_THRESH_BINARY ); /threshold it,二值化 cvUpdateMotionHistory( silh, mhi, timestamp, MHI_DURATION ); / update MHI cvConvert( mhi, dst );/将mhi转化为dst,dst=mhi / 中值滤波,消除小的噪声 cvSmooth( dst, dst, CV_MEDIAN, 3, 0, 0, 0); cvPyrDown( dst, pyr, CV_GAUSSIAN_5x5 );/ 向下采样,去掉噪声,图像是原图像的四分之一 cvDilate( pyr, pyr, 0,

19、 1 ); / 做膨胀操作,消除目标的不连续空洞 cvPyrUp( pyr, dst, CV_GAUSSIAN_5x5 );/ 向上采样,恢复图像,图像是原图像的四倍 / / 下面的程序段用来找到轮廓 / / Create dynamic structure and sequence. stor = cvCreateMemStorage(0); cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint) , stor); / 找到所有轮廓 cvFindContours( dst, stor, &cont,

20、 sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0); / 直接使用CONTOUR中的矩形来画轮廓 for(;cont;cont = cont->h_next) CvRect r = (CvContour*)cont)->rect; if(r.height * r.width > 1500) / 面积小的方形抛弃掉 bndRect = cvBoundingRect(cont, 0); /Get an average X position of the moving contour. avg

21、X = (bndRect.x + bndRect.x + bndRect.width) / 2; avgY = (bndRect.y + bndRect.y + bndRect.height) / 2;if(avgX > (m_tangle1.x>m_tangle2.x?m_tangle2.x:m_tangle1.x ) && avgX < (m_tangle1.x>m_tangle2.x?m_tangle1.x:m_tangle2.x )&& avgY < (m_tangle1.y>m_tangle2.y?m_tangle1

22、.y:m_tangle2.y) && avgY > (m_tangle1.y>m_tangle2.y?m_tangle2.y:m_tangle1.y ) cvRectangle( img, cvPoint(r.x,r.y), cvPoint(r.x + r.width, r.y + r.height), CV_RGB(255,0,0), 1, CV_AA,0); pt3.x = bndRect.x; pt3.y = bndRect.y; pt4.x = bndRect.x + bndRect.width; pt4.y = bndRect.y + bndRect.he

23、ight;cvInitFont(&font1, CV_FONT_HERSHEY_DUPLEX, 0.5, 0.5, 0, 2, 8); for(int i=0;i<30;i+) if(TrackBlocki->avgX !=0 && fabs(double)(avgX-TrackBlocki->avgX)<20 && fabs(double)(avgY-TrackBlocki->avgY)<50) cvPutText(img,msgi, cvPoint(pt3.x,pt4.y), &font1, cvScala

24、r(255,255,255); TrackBlocki->FramesTracked=nFrmNum; TrackBlocki->avgX=avgX; TrackBlocki->avgY=avgY; /记录运动轨迹 TrackBlocki->guiji_index=TrackBlocki->guiji_index+1; int index_g=TrackBlocki->guiji_index; TrackBlocki->guijiindex_g.x=avgX; TrackBlocki->guijiindex_g.y=avgY; for (int

25、k=1;k< index_g;k+) cvLine(img, cvPoint(TrackBlocki->guijik.x , TrackBlocki->guijik.y), cvPoint(TrackBlocki->guijik+1.x, TrackBlocki->guijik+1.y), CV_RGB(0,191,255), 2, 8, 0 ); /取轨迹中三点,判断其在被监控车道的运动趋势来得到是否为逆行 if (index_g >= 4) if (TrackBlocki->guiji1.y<TrackBlocki->guijiinde

26、x_g/2.y&&TrackBlocki->guijiindex_g/2.y<TrackBlocki->guijiindex_g-1.y)/在框内输出顺行cvPutText(img,"Normal", cvPoint(pt3.x+30,pt4.y), &font1, cvScalar(255,0,255); else cvPutText(img,"Regression", cvPoint(pt3.x+20,pt4.y), &font1, cvScalar(255,0,0); Findcar=true; b

27、reak;/使跳出for循环 if(Findcar!=true&& avgY<160)/表示没有找到车辆 TrackBlockNo->Direction=1; TrackBlockNo->FramesTracked=nFrmNum; TrackBlockNo->avgX=avgX; TrackBlockNo->avgY=avgY; if(No=29) No=0; else No+; m_totalcar+; CString str; str.Format("%d",m_totalcar); GetDlgItem(IDC_NUM)->SetWindowText(str); Findcar=false; /end of for/对于没有匹配的车辆,表示已经出了边界,清空数组for(int j=0;j<30;j+)if(TrackBlockj->FramesTracked != nFrmNum)/虽然置为零,但是可能零和当前中心的值在设定的范围内,所以不行。/TrackBlockj=NULL;为何用NULL不行。TrackBlockj->Direction=0;TrackBlockj->FramesTracked=0;TrackBlockj->avgX=0;Tra

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论