第一章 绪论 3
第二章 研究内容和意义 4
第三章 预期达到的技术目标和拟解决的技术问题 5
第四章 研究、试验方法和技术路线 7
第五章 实现过程 7
5.1硬件 7
5.2软件 9
5.3作品成型 21
第六章 课题总结 22
第一章 绪论
视频采集技术目前最大的应用领域还是安防监控,随着国内经济的发展和与国际经济的接轨,工业检测和医疗领域对多路采集的需求也在不断的增加。在交通、机器视觉、多媒体等领域也有重要的应用。在交通领域的应用主要是路面监控、违章抓拍、停车场收费、高速路收费;机器视觉领域的应用主要是生产过程监控、产品筛选等;多媒体领域的应用主要是多路视频采集后大屏显示、电视节目监播等。最后,视频采集应用的领域还包括纺织、印刷、印钞等大幅面图像检测应用。
基于图像的视觉跟踪伺服控制系统,视觉伺服误差直接定义在图像特征空间,摄像机观察到的特征信息直接用于反馈,不用对三维姿态进行估计。基于图像的视觉伺服控制系统中,二维图像特征通过雅可比矩阵与三维笛卡尔坐标系中的三维场景相联系,所以这种控制系统中雅可比矩阵的求解是关键。确定雅可基于图像的视觉伺服控比矩阵可以通过经验法、在线估计法、学习法等。经验法主要是通过摄像机标定或先验模型知识得到比较准确的雅可比矩阵;在线估计的方法可以事先不用进行摄像机标定,但存在雅可比矩阵的初值选择问题;学习方法主要是通过离线示教、自我学习、自我决策的人工神经网络的方法,这种方法需要大量样本才能计算准确。基于图像的视觉伺服控制系统可以不用3D重建,直接用图像特征控制执行机构运动。与基于位置的方法相比,基于图像的方法受传感器模型、运动学方程、摄像机标定所到来的误差的影响较小,静态定位的精度也比较高,但动态估计雅可比矩阵时,需要不断进行更新和求逆,计算时间上需要进一步优化;另外,由于系统是的且具有非线性解,因此不能保证在整个任务空间中都是收敛的。
第二章 研究内容和意义
视觉跟踪系统可分为基于位置和基于图像两种工作方式。
基于位置的视觉跟踪伺服控制系统,视觉伺服误差定义在三维笛卡尔坐标空间,视觉特征信息用来估计执行机构末端与目标的相对位姿。这种方法的主要优点是直接在三维空间控制执行机构运动,另外它把视觉重构问题从执行机构控制中分离出来,这样可以分别对二者进行研究,但这种方法一般需要对视觉系统和执行机构进行标定,而且由于要对图像进行解释,因而增加了计算量,另外,这种方法受传感器模型、运动学方程、摄像机标定所带来的误差影响较大。
基于图像的视觉跟踪伺服控制系统,视觉伺服误差直接定义在图像特征空间,摄像机观察到的特征信息直接用于反馈,不用对三维姿态进行估计。基于图像的视觉伺服控制系统中,二维图像特征通过雅可比矩阵与三维笛卡尔坐标系中的三维场景相联系,所以这种控制系统中雅可比矩阵的求解是关键。确定雅可基于图像的视觉伺服控比矩阵可以通过经验法、在线估计法、学习法等。经验法主要是通过摄像机标定或先验模型知识得到比较准确的雅可比矩阵;在线估计的方法可以事先不用进行摄像机标定,但存在雅可比矩阵的初值选择问题;学习方法主要是通过离线示教、自我学习、自我决策的人工神经网络的方法,这种方法需要大量样本才能计算准确。基于图像的视觉伺服控制系统可以不用3D重建,直接用图像特征控制执行机构运动。与基于位置的方法相比,基于图像的方法受传感器模型、运动学方程、摄像机标定所到来的误差的影响较小,静态定位的精度也比较高,但动态估计雅可比矩阵时,需要不断进行更新和求逆,计算时间上需要进一步优化;另外,由于系统是的且具有非线性解,因此不能保证在整个任务空间中都是收敛的。
本课题的工作主要基于uclinux操作系统,实现对特定障碍的监测,以及壁障预警工作。
本立项实现的目标包括如下几个方面:
◇研究相关计算机视频图像采集的理论和方法
◇研究壁障技术
◇从复杂场景中提取特征障碍信息
◇对障碍信息做出判断,预警
第三章 预期达到的技术目标 和拟解决的技术问题
一、计算机视觉图像处理技术主要有以下凡项内容:
1、图像数字化和压缩编码
图像数字化技术是把连续图像信号变为离散的数字信号,适应数字计算机或其它数字设备的运算处理。压缩编码技术是减少描述图像的数据量即比特率,以便节省传输、处理时间和存储器容量。
2、图像增强和复原
图像增强是突出图像中感兴趣的部分,图像复原是使失真图像尽可能恢复本来面貌。
3、图像分割
图像中包含的物体,按其灰度、色彩或几何特性分割,并进行分析处理,从中提取数据等有效分量。这是进一步进行图像处理、模式识别和机器视觉等技术的基础。
4、图像分类
图像分类是图像处理技术的深入和发展,也可以认为是模式识别的一个分支。其主要内容是在图像经过某些预处理(压缩、增强、复原)后,将图像中有用物体的特征进行特征分割、特征选择,进而进行判决分类。
5、图像重建
图像重建是对一些三维物体,应用X射线、超声波等物理方法获取物体内部结构的数据。再将此数据进行运算处理构成物体内部某些部位的图像。
第四章 研究、试验方法和技术路线
图1:初期整个系统简要分析。
图2:修改后整个系统简要分析(即技术线路)。
第五章 实现过程
5.1 硬件
1、应用器件
ARM7开发板,L298 ,DS18B20, ST188,电容,电阻等
2、电路原理图
图3
3、成型电路
图4
5.2 软件
1、软件结构图
图5
2、主要程序
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include #include IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0; //用HSV中的Hue分量进行跟踪 CvHistogram *hist = 0;//直方图类 int backproject_mode = 0; int select_object = 0; int track_object = 0; int show_hist = 1; CvPoint origin; CvRect selection; CvRect track_window; CvBox2D track_box;//Meanshift跟踪算法返回的Box类 CvConnectedComp track_comp; int hdims = 16;// 划分直方图bins的个数,越多越精确 float hranges_arr[] = {0,180};//像素值的范围 float* hranges = hranges_arr;//用于初始化CvHistogram类 int vmin = 90, vmax = 256, smin = 90; CvScalar hsv2rgb( float hue );//用于将Hue量转换成RGB量 这里没写 void loadTemplateImage() { cvCvtColor( tempimage, hsv, CV_BGR2HSV ); int _vmin = vmin, _vmax = vmax; cvInRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0), cvScalar(180,256,MAX(_vmin,_vmax),0), mask ); cvSplit( hsv, hue, 0, 0, 0 ); selection.x = 1; selection.y = 1; selection.width = 0-1; selection.height= 480-1; cvSetImageROI( hue, selection ); cvSetImageROI( mask, selection ); cvCalcHist( &hue, hist, 0, mask ); float max_val = 0.f; cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 ); cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 ); cvResetImageROI( hue ); cvResetImageROI( mask ); track_window = selection; track_object = 1; cvZero( histimg ); int bin_w = histimg->width / hdims; for(int i = 0; i < hdims; i++ ) { int val = cvRound( cvGetReal1D(hist->bins,i)*histimg->height/255 ); CvScalar color = hsv2rgb(i*180.f/hdims); cvRectangle( histimg, cvPoint(i*bin_w,histimg->height), cvPoint((i+1)*bin_w,histimg->height - val), color, -1, 8, 0 ); } cvReleaseImage(&tempimage); } void on_mouse( int event, int x, int y, int flags, void* param )//该函数用于选择跟踪目标 { if( !image ) return; if( image->origin ) y = image->height - y; if( select_object )//如果处于选择跟踪物体阶段,则对selection用当前的鼠标位置进行设置 { selection.x = MIN(x,origin.x); selection.y = MIN(y,origin.y); selection.width = selection.x + CV_IABS(x - origin.x); selection.height = selection.y + CV_IABS(y - origin.y); selection.x = MAX( selection.x, 0 ); selection.y = MAX( selection.y, 0 ); selection.width = MIN( selection.width, image->width ); selection.height = MIN( selection.height, image->height ); selection.width -= selection.x; selection.height -= selection.y; } switch( event ) { case CV_EVENT_LBUTTONDOWN://开始点击选择跟踪物体 origin = cvPoint(x,y); selection = cvRect(x,y,0,0);//坐标 select_object = 1;//表明开始进行选取 break; case CV_EVENT_LBUTTONUP: select_object = 0;//选取完成 if( selection.width > 0 && selection.height > 0 ) track_object = -1;//如果选择物体有效,则打开跟踪功能 break; } CvScalar hsv2rgb( float hue )//用于将Hue量转换成RGB量 { int rgb[3] , p, sector; static const int sector_data[][3]= {{0,2,1}, {1,2,0}, {1,0,2}, {2,0,1}, {2,1,0}, {0,1,2}}; hue *= 0.033333333333333333333333333333333f; sector = cvFloor(hue); p = cvRound(255*(hue - sector)); p ^= sector & 1 ? 255 : 0; rgb[sector_data[sector][0]] = 255; rgb[sector_data[sector][1]] = 0; rgb[sector_data[sector][2]] = p; return cvScalar(rgb[2], rgb[1], rgb[0],0);//返回对应的颜色值 } int main( int argc, char** argv ) { CvCapture* capture = 0; if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0]))) capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );//打开摄像头 else if( argc == 2 ) capture = cvCaptureFromAVI( argv[1] );//打开AVI文件 if( !capture ) { fprintf(stderr,"Could not initialize capturing...\\n");//打开视频流失败处理 return -1; } printf( "Hot keys: \\n" "\ESC - quit the program\\n" "\c - stop the tracking\\n" "\b - switch to/from backprojection view\\n" "\h - show/hide object histogram\\n" "To initialize tracking, select the object with mouse\\n" );////打印出程序功能列表 cvNamedWindow( "Histogram", 0 ); cvNamedWindow( "CamShiftDemo", 0 );//建立视频窗口 cvSetMouseCallback( "CamShiftDemo", on_mouse, 0 );// 设置鼠标回调函数 cvCreateTrackbar( "Vmin", "CamShiftDemo", &vmin, 256, 0 );//建立滑动条 cvCreateTrackbar( "Vmax", "CamShiftDemo", &vmax, 256, 0 ); cvCreateTrackbar( "Smin", "CamShiftDemo", &smin, 256, 0 ); for(;;)//进入视频帧处理主循环 { IplImage* frame = 0; int i, bin_w, c; frame = cvQueryFrame( capture ); if( !frame ) break; cvAnd( backproject, mask, backproject, 0 );//得到反向投影图mask内的内容 cvCamShift( backproject, track_window, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp, &track_box );//使用MeanShift算法对backproject中的内容进行搜索,返回跟踪结果 track_window = track_comp.rect;//得到跟踪结果的矩形框 } if( select_object && selection.width > 0 && selection.height > 0 )//如果正处于物体选择,画出选择框 { cvSetImageROI( image, selection ); cvXorS( image, cvScalarAll(255), image, 0 ); cvResetImageROI( image ); } cvShowImage( "CamShiftDemo", image );//显示视频和直方图 cvShowImage( "Histogram", histimg ); c = cvWaitKey(10); if( c == 27 )break; switch( c ) { case 'b': backproject_mode ^= 1;break; case 'c': track_object = 0;cvZero( histimg );break; case 'h':show_hist ^= 1; if( !show_hist ) cvDestroyWindow( "Histogram" ); default: ; } } cvReleaseCapture( &capture ); cvDestroyWindow("CamShiftDemo"); return 0; } #ifdef _EiC main(1,"camshiftdemo.c"); #endif 5.3 作品成型 作品成型后如图所示: 图6 第六章 课题总结 将近三个月的课题研究,我们基本上完成了题为小车的制作,作品基本能完成要求的功能。在此期间经过不断地学习与探索,使我们了解了ARM的工作原理及其应用。在电路原理图到电路成型的整个过程中,使我们深刻的了解到各种电子器件的电气特性以及工作环境,尤其是要参考现场环境因素。实现了小车通过红外传感器的准确巡线,驱动模块正常工作。还有通过软件的调试使四位共阴数码管实现精确计时。 指导老师把设计和制作的任务完全交给了我们,我们得自选方案,画好设计所需的电路图,还要从硬件和软件两个方面着手开展我们的设计与制作。这和我们以前做的课程设计有很大的不同,一是没有现成的方案供选择,二是没有现成的电路图供参考,三是没有类似的算法和程序供使用。我们初期复习了单片机的基础知识,因为智能小车控制的核心部件是单片机,然后我们从小车需要完成的不同任务着手查阅了大量的资料,确定小车制作需要的控制模块。确定好控制模块后,我们开始动手制作各个相关的模块,同时还要把控制各个模块的程序写好并完成相关的硬件和软件的调试。 此次设计涉及到电气专业的许多主干课程:模电(放大器和光电隔离)、数电(数模转换)、电力电子技术(pwm控制)、传感器(各种传感器的原理和使用)、电机学(直流电机)等等。通过这个实践,我知道自己的专业知识有许多地方学得不好,在剩下的两年时间里,我得注重主干课程的学习,为毕业论文的设计提前做好准备,也为即将面临的实习和就业做好知识储备。