上大计算机视觉实验报告资料.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(j);
for(inti=0;idata[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(log(static_cast(div))/log(2.0));
//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(log(static_cast(div))/log(2.0));
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:
:
vectorfaces;
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:
:
vectoreyes;
//--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.根据实验结果截图显示有些时候并不能检测出人脸,尤其是有手、眼镜等等在脸前面的时候