上大计算机视觉实验报告资料.docx
- 文档编号:3552456
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:13
- 大小:1.02MB
上大计算机视觉实验报告资料.docx
《上大计算机视觉实验报告资料.docx》由会员分享,可在线阅读,更多相关《上大计算机视觉实验报告资料.docx(13页珍藏版)》请在冰豆网上搜索。
上大计算机视觉实验报告资料
实验1
一.习题1
a)实验代码
intmain(){
//readanimage
cv:
:
Matimage=cv:
:
imread("test.jpg");
//createimagewindownamed"MyImage"
//cv:
:
namedWindow("MyImage");
//showtheimageonwindow
//cv:
:
imshow("MyImage",image);
//waitkeyfor5000ms
IplImage*pImg=cvLoadImage("test.jpg");
CvFontfont;
cvInitFont(&font,CV_FONT_HERSHEY_COMPLEX,0.5,0.5,1,2,8);
cvPutText(pImg,"12121448",cvPoint(0,50),&font,CV_RGB(255,255,255));
cvSaveImage("D:
\\testttt.jpg",pImg);
cvNamedWindow("Myimage");
cvShowImage("Myimage",pImg);
cv:
:
waitKey(5000);
return1;
b)
实验结果截图
c)结果分析
1.第一次主要是熟悉VS里面如何运用已有的openCV库函数来解决实际的问题
2.这次实验通过查阅书籍,我找到了在图片中快速插入文字的方法,即运用cv:
:
puttext函数还来解决,需要注意的是这个函数的参数,需要确定在图片中位置。
实验2
一.习题1.
a)实验代码
#include"stdafx.h"
#include"opencv.hpp"
#include
#ifdefined_DEBUG
#pragmacomment(lib,"opencv_core249d.lib")
#pragmacomment(lib,"opencv_imgproc249d.lib")
#pragmacomment(lib,"opencv_highgui249d.lib")
#else
#pragmacomment(lib,"opencv_core249.lib")
#pragmacomment(lib,"opencv_imgproc249.lib")
#pragmacomment(lib,"opencv_highgui249.lib")
#endif
voidcopy_color(cv:
:
Mat&image){
intnl=image.rows;
intnc=image.cols*image.channels()/2;
for(intj=0;j { uchar*data=image.ptr for(inti=0;i data[i]=data[nc+i]; } } intmain(){ cv: : Matimage=cv: : imread("1.jpg"); copy_color(image); cv: : namedWindow("MyImage"); cv: : imshow("MyImage",image); cv: : waitKey(50000); return1; } b)实验结果截图 c)结果分析 利用X和Y的两次循环将整块图片复制过去,裁减函数做得有欠缺。 实验3 一.习题1 a)实验代码: 方法一: data[i]=data[i]/div*div+div/2; 原始图像中的每个维度的颜色数降低为原来的1/div,但是整张图片的像素点数并没有减少,只是每个像素点都被它所在格子中的中心像素“量化”了。 方法二: *data++=*data/div*div+div/2; 与方法一相比,方法二只是在颜色缩减的图像遍历函数上面做出了修改,等效的使用指针运算从一列移动到下一列。 方法三: intv=*data; *data++=v-v%div+div/2; 通过模运算来计算最接近被除数的除数的整数倍数,但是这种方式速度会慢一些,因为对于一张图片的像素来说存取了两次。 方法四: intnl=image.rows;//numberoflines intnc=image.cols*image.channels();//totalnumberofelementsperline intn=static_cast //maskusedtoroundthepixelvalue ucharmask=0xFF< 用移位的方法来进行乘除计算是一种高效的方法,如果我们限制缩减因子为2的幂次,只取像素值的前n位即可得到不大于该值的关于缩减因子的最大整数倍数,所以可见其在效率上来讲非常高效。 方法五: intstep=image.step;//effectivewidth data+=step;//nextline 与方法四类似,,只有颜色缩减函数的赋值语句*(data+i)=*data&mask+div/2;不同,并且加上step的行宽可以便捷地完成换行操作,速度比方法四更快。 方法六: 与方法五相比缺少intnc=image.cols*image.channels();//totalnumberofelementsperline;这样导致我们在每次reduce的时候要计算一次行中的像素数,导致速度成倍降低。 方法七: if(image.isContinuous()){ //thennopaddedpixels nc=nc*nl; nl=1;//itisnowa1Darray } 通过增加isContinuous()函数,来检测是否存在没有使用额外像素填补的图像的情况,如果不存在使用这个函数能够使得遍历图像的速度更快——如果是连续的,就可以直接当作一维数组来处理。 方法八: intnl=image.rows;//numberoflines intnc=image.cols;//numberofcolumns 与方法七类似,不同的是将nc直接赋值为列数,而不是方法七的intnc=image.cols*image.channels();//totalnumberofelementsperline,来表示每行的像素点个数。 这样虽然计算次数变多了,但是由于计算量变少了,总体速度变快了。 方法九: cv: : Mat_ : Vec3b>: : iteratorit=image.begin : Vec3b>(); cv: : Mat_ : Vec3b>: : iteratoritend=image.end : Vec3b>(); 调用cv: : Mat的模板迭代器的begin和end来表示图像的起始和终止位置,从而遍历整张图片,但由于是最原始的迭代器,计算效率不高,遍历图像速度慢。 方法十: intn=static_cast ucharmask=0xFF< 与方法九类似,不同的是增加位运算使得迭代的效率更高,速度更快。 方法十一: cv: : Mat_ : Vec3b>cimage=image; 同样与方法九类似,通过调用cv: : Mat_的begin()和end()来处理,效率变低。 方法十二: image.at : Vec3b>(j,i)[0]=image.at : Vec3b>(j,i)[0]/div*div+div/2; image.at : Vec3b>(j,i)[1]=image.at : Vec3b>(j,i)[1]/div*div+div/2; image.at : Vec3b>(j,i)[2]=image.at : Vec3b>(j,i)[2]/div*div+div/2; 通过图像矩阵的方法at(j,i)精确定位图像中的每一个点,这样图像颜色增减就能够方便地通过取每个点的RGB来完成操作,但是缺点也显而易见,对每个点操作需要浪费大量的空间和时间。 b)实验结果截图: c)结果分析: 方法三和方法十相比方法一和方法九都增加了位运算,但是感觉上应该更加快,事实上却分别慢了6ms和3ms,这让我很意外。 我认为造成这种结果的原因可能是遍历图像的算法过于简单,致使没有使用到过多的位运算,体现不出位运算的优势。 方法七与方法八速度差不多,说明每次计算各行中的像素个数所需计算量不大,对运算结果的时间并没有造成很大的影响。 通过对比方法九和方法十一,可以发现调用cv: : Mat的内置迭代器和自己编写迭代器的运行速度有明显的区别。 实验4 一.习题1. a)实验代码 #include"stdafx.h" #include"opencv.hpp" #include #ifdefined_DEBUG #pragmacomment(lib,"opencv_core249d.lib") #pragmacomment(lib,"opencv_imgproc249d.lib") #pragmacomment(lib,"opencv_highgui249d.lib") #else #pragmacomment(lib,"opencv_core249.lib") #pragmacomment(lib,"opencv_imgproc249.lib") #pragmacomment(lib,"opencv_highgui249.lib") #endif intmain() { cv: : Matfind=cv: : imread("find.jpg",0); cv: : Matmap=cv: : imread("img.jpg",0); cv: : Matoutput=cv: : imread("img.jpg",1); find.convertTo(find,CV_32F); for(intx=0;x<=map.rows-find.rows;++x) { for(inty=0;y<=map.cols-find.cols;++y) { cv: : Matsmall=map(cv: : Range(x,x+find.rows),cv: : Range(y,y+find.cols)); small.convertTo(small,CV_32F); doublesimilar=cv: : compareHist(find,small,CV_COMP_CORREL); if(similar>0.99){ cv: : rectangle(output,cv: : Point(y,x),cv: : Point(y+find.cols,x+find.rows),cv: : Scalar(0,0,255)); cv: : Point(y+find.cols,x+find.rows); cv: : Scalar(0,0,255); } } } cv: : imshow("resultofthecheck",output); cv: : waitKey(0); } b)实验结果截图 c)结果分析 1.本实验通过遍历图片,找图与find图片相似度大于99%的 2.比较主要通过相同的矩形框,利用双重循环遍历图片 实验5 一.习题1. a)实验代码 #include #include #include #include #include #include usingnamespacestd; usingnamespacecv; /**FunctionHeaders*/ voiddetectAndDisplay(Matframe); /**Globalvariables*/ //--Note,eithercopythesetwofilesfromopencv/data/haarscascadestoyourcurrentfolder,orchangetheselocations Stringface_cascade_name="haarcascade_frontalface_alt.xml"; Stringeyes_cascade_name="haarcascade_eye_tree_eyeglasses.xml"; CascadeClassifierface_cascade; CascadeClassifiereyes_cascade; stringwindow_name="Capture-Facedetection"; RNGrng(12345); intmain(intargc,constchar**argv) { Matframe; //--1.Loadthecascades if(! face_cascade.load(face_cascade_name)){printf("--(! )Errorloading\n");return-1;}; if(! eyes_cascade.load(eyes_cascade_name)){printf("--(! )Errorloading\n");return-1;}; //--2.Readthevideostream //CvCapture*capture=cvCaptureFromCAM(-1);//摄像头读取文件开关 VideoCapturecapture("test.avi"); if(capture.isOpened()/*capture*/)//摄像头读取文件开关 { while(true) { //frame=cvQueryFrame(capture);//摄像头读取文件开关 capture>>frame; //--3.Applytheclassifiertotheframe if(! frame.empty()) {detectAndDisplay(frame);} else {printf("--(! )Nocapturedframe--Break! ");break;} intc=waitKey(10); if((char)c=='c'){break;} } } return0; } voiddetectAndDisplay(Matframe) { std: : vector Matframe_gray; cvtColor(frame,frame_gray,CV_BGR2GRAY); equalizeHist(frame_gray,frame_gray); //--Detectfaces face_cascade.detectMultiScale(frame_gray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30)); for(size_ti=0;i { Pointcenter(int(faces[i].x+faces[i].width*0.5),int(faces[i].y+faces[i].height*0.5)); ellipse(frame,center,Size(int(faces[i].width*0.5),int(faces[i].height*0.5)),0,0,360,Scalar(255,0,255),2,8,0); MatfaceROI=frame_gray(faces[i]); std: : vector //--Ineachface,detecteyes eyes_cascade.detectMultiScale(faceROI,eyes,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30)); for(size_tj=0;j { Pointcenter(int(faces[i].x+eyes[j].x+eyes[j].width*0.5),int(faces[i].y+eyes[j].y+eyes[j].height*0.5)); intradius=cvRound((eyes[j].width+eyes[i].height)*0.25); circle(frame,center,radius,Scalar(255,0,0),3,8,0); } } //--Showwhatyougot imshow(window_name,frame); } b)实验结果截图 c)结果分析 1.实验代码是从网上下载稍加修改的,主要取自opencv官网的教材 2.根据实验结果截图显示有些时候并不能检测出人脸,尤其是有手、眼镜等等在脸前面的时候
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 视觉 实验 报告 资料