OPENCV毕业实习报告Word格式.docx

上传人:b****8 文档编号:22777083 上传时间:2023-02-05 格式:DOCX 页数:27 大小:33.45KB
下载 相关 举报
OPENCV毕业实习报告Word格式.docx_第1页
第1页 / 共27页
OPENCV毕业实习报告Word格式.docx_第2页
第2页 / 共27页
OPENCV毕业实习报告Word格式.docx_第3页
第3页 / 共27页
OPENCV毕业实习报告Word格式.docx_第4页
第4页 / 共27页
OPENCV毕业实习报告Word格式.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

OPENCV毕业实习报告Word格式.docx

《OPENCV毕业实习报告Word格式.docx》由会员分享,可在线阅读,更多相关《OPENCV毕业实习报告Word格式.docx(27页珍藏版)》请在冰豆网上搜索。

OPENCV毕业实习报告Word格式.docx

实际得分

总得分

备注

实习表现

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 辩护词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1