OPENCV毕业实习报告Word格式.docx
《OPENCV毕业实习报告Word格式.docx》由会员分享,可在线阅读,更多相关《OPENCV毕业实习报告Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
实际得分
总得分
备注
实习表现
30
10
按时参加实习活动,无旷课、迟到、早退等情况。
遵守实习单位纪律和安排,无违反实习单位规定的情况;
听从指导教师的安排,参加各项活动,无不服从教师管理的现象。
按期圆满完成规定的任务,工作量饱满;
能运用所学知识和技能去发现与解决实际问题,工作中有创新意识。
实习报告
40
15
实习报告文字通顺,内容翔实,论述充分、完整,结构严谨合理。
能运用所学专业知识对问题加以分析。
正确处理相关的数据,分析处理科学;
具有收集、加工各种信息及获得新知识的能力。
5
实习报告字数符合相关要求,实习报告工整规范,整齐划一。
实习日记(笔记)次数及内容符合要求。
实习答辩
在规定时间内能就实习的内容进行全面完整的阐述,言简意明,重点突出,条理清晰。
在规定时间内能准确、完整、流利地回答教师所提出的问题。
总评成绩:
分
补充说明:
指导教师:
(签字)
日期:
年月日
毕业实习答辩记录表
高强学号:
0805090204班级:
计科2班
答辩地点:
机电大楼417
答辩内容记录:
答辩成绩
答辩小组成员(签字):
年月日
指导教师评语
指导教师:
一、实习目的与任务
学习和掌握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("
pImg);
//显示图像,第一个参数为窗口的标题,第二个参数为要显示图像的指针
cvWaitKey(0);
//等待按键,后面的参数为等待的时间,单位为ms,为0则意为一直等到你按键为止,若改为1000则为图像显示1秒后消失
cvDestroyWindow("
);
//销毁窗口
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<
stdio.h>
time.h>
#include"
cv.h"
cxcore.h"
highgui.h"
#pragmacomment(lib,"
cv.lib"
)
cxcore.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<
size;
i++)
{
if(max<
data[i])
{
max=data[i];
}
if(min>
min=data[i];
}
doublesub=max-min;
if(sub<
0.00001)
return;
double*pNor=(dst==NULL)?
data:
dst;
for(i=0;
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)
BYTE*pSrcData=(BYTE*)(pSrcImg->
imageData);
BYTE*pDstData=(BYTE*)(pDstImg->
intwinSize=winWidth;
double*pAvgImg=newdouble[iWidth*iHeight];
double*pVarImg=newdouble[iWidth*iHeight];
//1.获取局部均值图,和局部方差图,并作归一化处理
for(y=0;
y<
iHeight;
y++)
for(x=0;
x<
iWidth;
x++)
intcx=x;
intcy=y;
intcnt=0;
intnx,ny;
//获取局部均值
doubleavg=0;
for(ny=cy-winSize;
ny<
cy+winSize;
ny++)
{
for(nx=cx-winSize;
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;
var+=(pSrcData[ny*iWidth+nx]-avg)*(pSrcData[ny*iWidth+nx]-avg);
var/=cnt;
pVarImg[y*iWidth+x]=var;
Normalization(pAvgImg,iWidth*iHeight);
Normalization(pVarImg,iWidth*iHeight);
//2.对于每一个像素点,如果(均值>
ThAvg&
&
方差<
ThVar),则认为是云;
否则,不是云。
iWidth*iHeight;
pDstData[i]=(pAvgImg[i]>
pVarImg[i]<
ThVar)?
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]);
char*srcPicFile=NULL;
boolbSave=false;
boolbShow=false;
doubleTA=0.6;
doubleTV=0.1;
intws=3;
for(intj=1;
j<
argc;
j++)
if(strcmp(strlwr(argv[j]),"
-s"
)==0&
j<
argc-1)
srcPicFile=argv[j+1];
-save"
)==0)
bSave=true;
-show"
bShow=true;
-ta"
argc-1)
TA=atof(argv[j+1]);
-tv"
TV=atof(argv[j+1]);
-ws"
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);
IplImage*pSrc=cvLoadImage(srcPicFile,CV_LOAD_IMAGE_GRAYSCALE);
IplImage*pDst=cvCloneImage(pSrc);
intwidth=pColorImg->
width;
intheight=pColorImg->
intstep=pColorImg->
printf("
start...\n"
);
clock_tstart,end;
start=GetTickCount();
CloudDetect(pSrc,pDst,ws,TA,TV);
end=GetTickCount();
cost:
%dms\n"
end-start);
BYTEcolor[3]={0,0,255};
for(inty=0;
height;
y++)
for(intx=0;
width;
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);
pDst);
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