OPENCV毕业实习报告.docx
《OPENCV毕业实习报告.docx》由会员分享,可在线阅读,更多相关《OPENCV毕业实习报告.docx(27页珍藏版)》请在冰豆网上搜索。
OPENCV毕业实习报告
武汉工程大学
计算机科学与工程学院
毕业实习报告
专业
计算机科学与技术(计算机科学)
班级
08计科02班
学号
0805090204
学生姓名
高强
指导教师
金国祥(教授)
实习时间
2012学年第二学期
2012.2.20至2012.3.9
实习成绩
武汉工程大学计算机科学与工程学院制
说明:
1、实习指导教师由学院校内教师担任,负责组织实习、学生管理、参加实习答辩、实习成绩评定、给出实习评语等工作。
2、实习报告由武汉工程大学计算机科学与工程学院提供基本格式(适用于学院各专业),各专业教研室和指导教师可根据本专业特点及实习内容做适当的调整,学生须按指导教师下达的实习报告格式认真进行填写。
3、实习成绩由指导教师根据学生的实习情况给出各项分值及总评成绩。
4、指导教师评语一栏由实习指导教师(校内教师)就学生在整个实习期间的表现给出客观、全面的评价,包括实习期间的表现、实习报告的质量、实习答辩的情况等。
5、学生必须参加实习答辩,凡不参加实习答辩者,实习成绩一律按不及格处理。
实习答辩小组应由2人及以上教师组成,其中校内指导教师必须参加,否则视作无效答辩。
6、实习报告正文字数应不少于5000字,实习日记字数不少于200字/天。
7、实习报告正文中实习目的与任务、实习地点、实习内容和要求等项,可由指导教师统一给出(自主实习除外)。
学生自主实习的,可根据实习的情况自行填写以上内容。
8、自主实习的学生还应提供由实习单位出具的实习鉴定表(复印件),与实习报告一起装订,作为参加实习答辩和评定成绩的依据。
毕业实习成绩评定表
学生姓名:
高强学号:
0805090204班级:
计科2班
类别
总分值
各项分值
评分标准
实际得分
总得分
备注
实习表现
30
10
按时参加实习活动,无旷课、迟到、早退等情况。
10
遵守实习单位纪律和安排,无违反实习单位规定的情况;听从指导教师的安排,参加各项活动,无不服从教师管理的现象。
10
按期圆满完成规定的任务,工作量饱满;能运用所学知识和技能去发现与解决实际问题,工作中有创新意识。
实习报告
40
15
实习报告文字通顺,内容翔实,论述充分、完整,结构严谨合理。
能运用所学专业知识对问题加以分析。
15
正确处理相关的数据,分析处理科学;具有收集、加工各种信息及获得新知识的能力。
5
实习报告字数符合相关要求,实习报告工整规范,整齐划一。
5
实习日记(笔记)次数及内容符合要求。
实习答辩
30
15
在规定时间内能就实习的内容进行全面完整的阐述,言简意明,重点突出,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
总评成绩:
分
补充说明:
指导教师:
(签字)
日期:
年月日
毕业实习答辩记录表
学生姓名:
高强学号:
0805090204班级:
计科2班
答辩地点:
机电大楼417
答辩内容记录:
答辩成绩
总分值
各项分值
评分标准
实际得分
总得分
备注
30
15
在规定时间内能就实习的内容进行全面完整的阐述,言简意明,重点突出,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
答辩小组成员(签字):
年月日
指导教师评语
指导教师:
(签字)
日期:
年月日
一、实习目的与任务
学习和掌握Intel开源计算机视觉库——OpenCV的基本用法,能够利用它进行基本的图像绘制,甚至边缘检测,云检测等。
二、实习地点
湖北省武汉市江夏区武汉工程大学流芳校区机电大楼419机房
三、实习要求和内容
(一)实习要求:
1.会安装OpenCV和VC6(或者VS2005)并进行正确配置;
2.能够用OpenCV进行图像的读入、显示、创建、复制和保存等;
3.能够用OpenCV进行图像的简单绘制,比如直线、三角形、矩形、圆形、椭圆,并能够在图像中添加文本框和给图像上色;
4.能够用OpenCV进行图像的边缘检测、云检测,以及能够初步理解条形码生成技术和检测技术。
(二)实习内容:
本次实习内容其实很简单,就是学习和掌握OpenCV的用法。
OpenCV是Intel开源计算机视觉库,它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。
要利用OpenCV进行开发,首先需要安装配置程序运行环境,下面以VS2005为例介绍安装配置的方法:
1.安装VS2005和OpenCV;
2.配置Windows环境变量。
检查C:
\ProgramFiles\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。
加入后需要注销当前Windows用户(或重启)后重新登陆才生效(注意,此步骤可以省略,但如果省略的话,要记得把OpenCV的bin里的文件拷贝到VS2005所在的工程文件夹中);
3.配置VS2005。
首先,打开VS2005的工具-》选项-》项目和解决方案-》VC++目录,在库文件里面添加OpenCV的Lib库,在包含文件里面添加OpenCV的cxcore\include,cv\include,cvaux\include,ml\include,otherlibs\highgui,otherlibs\cvcam\include,接着在工程属性里面加入cxcore.libcv.libml.libcvaux.libhighgui.lib等需要的库即可。
配置完OpenCV后就可以开始进行开发了。
首先我们需要了解图像的特点,图像有两种,灰度(黑白)图和彩色图,而不管是黑白还是彩色,都有一个色彩深度的概念,即一种颜色有多少个灰度级,一般有8位,16位,32位之分,8位即2的8次方(256)个灰度级,比如8位灰度图中的像素只有0-255个灰度级,而8位彩色图中的像素则由红绿蓝三种颜色组成,每种颜色有0-255个等级。
了解了这些之后,我们再来逐个讲解用OpenCV画图的重难点。
1.图像的读入和显示
IplImage*pImg;//声明IplImage指针用来载入图像
pImg=cvLoadImage(argv,1);
//利用cvLoadImage函数来载入图像,其中第一个参数为要载入的图像的地址,第二个参数为载入图像的类型(1为彩色图像)
cvNamedWindow("Image",1);//创建窗口用来显示图像,第一个参数为窗口的标题
cvShowImage("Image",pImg);
//显示图像,第一个参数为窗口的标题,第二个参数为要显示图像的指针
cvWaitKey(0);
//等待按键,后面的参数为等待的时间,单位为ms,为0则意为一直等到你按键为止,若改为1000则为图像显示1秒后消失
cvDestroyWindow("Image");//销毁窗口
cvReleaseImage(&pImg);//释放图像
2.图像的创建,保存和复制
IplImage*pImg=cvCreateImage(cvGetSize(pImg),pImg->depth,
pImg->nChannels);
//用cvCreateImage创建图像并用pImg指向该图像,第一个参数为图像的大小,第二个参数为图像的深度,第三个参数若为1则为彩色图,3则为黑白图
cvCopy(pImg,pImg2,NULL);//将pImg指针所指图像复制到pImg2所指图像
cvSaveImage(argv,pImg2);//把图像写入文件,arvg指新图像的地址或指针
3.图像的基本绘制
CvPoint//二维坐标系下的点,类型为整型,有x、y两个int成员
CV_RGB(r,g,b)//颜色函数,rgb分别为红色分量、绿色分量、蓝色分量
cvLine(pImg,cvPoint(50,50),cvPoint(50,400),CV_RGB(0,0,0))
//在pImg图像上画直线,直线以两点(50,50)和50,400)确定,颜色为黑色
cvRectangle(pImg,pt1,pt2,CV_RGB(0,0,0),1)
//在pImg图像上画矩形,矩形以左上角pt1点和右下角pt2确定,颜色为黑色,最后一个参数若为-1则为填充为边框颜色的实心矩形,若为1则为空心矩形,即只有一个边框
cvEllipse(pImg,pt1,cvSize(a,b),0,0,360,CV_RGB(0,0,0))
//在pImg图像上画(椭)圆(弧),以pt1为圆心,ab为两个半轴长(为圆的话则ab相等),后面的三个参数分别为偏转角度0度、起始角度0度、结束角度360度,最后一个为画笔颜色
CvFontx;
cvInitFont(&x,CV_FONT_HERSHEY_SIMPLEX,1,1);
cvPutText(pImg2,"gaoq",cvPoint(200,200),&x,CV_RGB(255,0,0));
//先声明一个字体结构变量x,然后用cvInitFont给x初始化字体的类型和大小粗细等,最后用cvPutText函数在pImg2图像上以x的字体输出字符串gaoq,颜色为红色(红色分量为255最大,其它为0,为红色)
4.图像的边缘检测与云检测
cvCanny(pDstImg,pDstImg,10,30)
//边缘检测函数,云检测的基础,前两个pDstImg分别为源路径和目的路径,后面两个是阈值参数,根据情况自行设定
voidcvThreshold(constCvArr*src,CvArr*dst,doublethreshold,doublemax_value,intthreshold_type);
//二值化函数,其参数分别为原始数组,输出数组,阈值,最大值,阈值类型,(云检测也可用for循环等知识自己形成二值化图像,然后再用边缘检测函数勾勒出边缘,由于这个比较复杂,下面给出具体的代码)
#include
#include
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
#pragmacomment(lib,"cv.lib")
#pragmacomment(lib,"cxcore.lib")
#pragmacomment(lib,"highgui.lib")
voidCloudDetect(IplImage*pSrcImg,
IplImage*pDstImg,
intwinWidth=3,
doubleThAvg=0.4,
doubleThVar=0.4);
staticvoidNormalization(double*data,intsize,double*dst=NULL)
{
doublemax=data[0];
doublemin=data[0];
inti;
for(i=1;i{
if(max{
max=data[i];
}
if(min>data[i])
{
min=data[i];
}
}
doublesub=max-min;
if(sub<0.00001)
{
return;
}
double*pNor=(dst==NULL)?
data:
dst;
for(i=0;i{
pNor[i]=(data[i]-min)/sub;
}
}
voidCloudDetect(IplImage*pSrcImg,IplImage*pDstImg,intwinWidth,doubleThAvg,doubleThVar)
{
inti,x,y;
intiHeight=pSrcImg->height;
intiWidth=pSrcImg->widthStep;//注意widthStep不是width
intiChannel=pSrcImg->nChannels;
if(iChannel!
=1)
{
return;
}
BYTE*pSrcData=(BYTE*)(pSrcImg->imageData);
BYTE*pDstData=(BYTE*)(pDstImg->imageData);
intwinSize=winWidth;
double*pAvgImg=newdouble[iWidth*iHeight];
double*pVarImg=newdouble[iWidth*iHeight];
//1.获取局部均值图,和局部方差图,并作归一化处理
for(y=0;y{
for(x=0;x{
intcx=x;
intcy=y;
intcnt=0;
intnx,ny;
//获取局部均值
doubleavg=0;
for(ny=cy-winSize;ny{
for(nx=cx-winSize;nx{
if(nx<0||nx>=iWidth||ny<0||ny>=iHeight)
{
continue;
}
avg+=pSrcData[ny*iWidth+nx];
cnt++;
}
}
if(cnt>0)
{
avg/=cnt;
}
pAvgImg[y*iWidth+x]=avg;
//获取局部方差
doublevar=0;
for(ny=cy-winSize;ny{
for(nx=cx-winSize;nx{
if(nx<0||nx>=iWidth||ny<0||ny>=iHeight)
{
continue;
}
var+=(pSrcData[ny*iWidth+nx]-avg)*(pSrcData[ny*iWidth+nx]-avg);
}
}
if(cnt>0)
{
var/=cnt;
}
pVarImg[y*iWidth+x]=var;
}
}
Normalization(pAvgImg,iWidth*iHeight);
Normalization(pVarImg,iWidth*iHeight);
//2.对于每一个像素点,如果(均值>ThAvg&&方差for(i=0;i{
pDstData[i]=(pAvgImg[i]>ThAvg&&pVarImg[i]255:
0;
}
delete[]pAvgImg;
delete[]pVarImg;
//边缘检测
cvCanny(pDstImg,pDstImg,10,30);
}
voidmain(intargc,char**argv)
{
char*usage[]=
{
"Usage:
CloudDetect[-s\\srcpic][-save][-show][-TA\\threshold]\n",
"[-TV\\threshold][-ws\\windowsize]\n",
"-ssourcepicturepath\n",
"-savesavedetectedresult\n",
"-showshowdetectedresult\n",
"-TAthresholdofaverage,default:
0.6\n",
"-TVthresholdofvarience,default:
0.1\n",
"-wswindowsize,defaut:
3,means:
7*7\n",
"CloudDetect-sd:
\\campus\\cloud.bmp\n",
};
if(argc==1)
{
for(inti=0;i<9;i++)
{
printf(usage[i]);
}
return;
}
char*srcPicFile=NULL;
boolbSave=false;
boolbShow=false;
doubleTA=0.6;
doubleTV=0.1;
intws=3;
for(intj=1;j{
if(strcmp(strlwr(argv[j]),"-s")==0&&j{
srcPicFile=argv[j+1];
}
if(strcmp(strlwr(argv[j]),"-save")==0)
{
bSave=true;
}
if(strcmp(strlwr(argv[j]),"-show")==0)
{
bShow=true;
}
if(strcmp(strlwr(argv[j]),"-ta")==0&&j{
TA=atof(argv[j+1]);
}
if(strcmp(strlwr(argv[j]),"-tv")==0&&j{
TV=atof(argv[j+1]);
}
if(strcmp(strlwr(argv[j]),"-ws")==0&&j{
ws=atoi(argv[j+1]);
}
}
charsavename[512]={0};
sprintf(savename,"%s.%4.2f_%4.2f_%d.bmp",srcPicFile,TA,TV,ws);
IplImage*pColorImg=cvLoadImage(srcPicFile,CV_LOAD_IMAGE_COLOR);
if(pColorImg==NULL)
{
printf("Loadimage%sfailed!
\n",srcPicFile);
return;
}
IplImage*pSrc=cvLoadImage(srcPicFile,CV_LOAD_IMAGE_GRAYSCALE);
IplImage*pDst=cvCloneImage(pSrc);
intwidth=pColorImg->width;
intheight=pColorImg->height;
intstep=pColorImg->widthStep;
printf("start...\n");
clock_tstart,end;
start=GetTickCount();
CloudDetect(pSrc,pDst,ws,TA,TV);
end=GetTickCount();
printf("cost:
%dms\n",end-start);
BYTEcolor[3]={0,0,255};
for(inty=0;y{
for(intx=0;x{
if(pDst->imageData[y*pDst->widthStep+x]!
=0)
{
memcpy(pColorImg->imageData+y*step+x*3,color,3);
}
}
}
if(bSave)
{
cvSaveImage(savename,pColorImg);
}
if(bSave&&bShow)
{
system(savename);
}
cvReleaseImage(&pSrc);
cvReleaseImage(&pDst);
cvReleaseImage(&pColorImg);
}
(附注:
该程序生成的控制台程序要通过命令提示符来执行)
5.OpenCV的其它应用
OpenCV还有个比较重要的应用就是条形码的生成与识别。
由于时间有限,周老师并不要求我们掌握条形码的生成与识别,特别是相对困难的识别技术。
我在私下里看了下周老师给我们留下的研究资料,发现条形码的生成确实不是很难,这里就简单说一下。
国家的EAN-13条形码的生成并不难,关键是要查表。
条形码一共13位,第13位是校验位,由前12位生成。
首先将条形码第一位与下表1匹配,查出6个映射字母,然后取出条形码第二位到第七位,利用下表2中的AB有关项与此字母组进行匹配,查出前6位,接着把第八位到第十三位取出与表2的C有关项进行匹配,查出后六位。
最后按照两部分数据绘制条形码:
1对应黑线,0对应白线即可。
例如,假设一个条形码的数据码为:
6901038100578。
首位为6,查表1对应的字母码为ABBBAA,第2-7位数字与字母码按位进行搭配结果为9A、0B、1B、0B、3A、8A,查表2得第一部分数据的编码分别为0001011、0100111、0110011、0100111、0111101、0110111;第8-13位数字与C进行搭配结果为1C、0C、0C、5C、7C、8C,查表2得第二部分数据的编码分别为1100110、1110010、1110010、1001110、1000100、1001000。
表格1