上大计算机视觉实验报告资料.docx

上传人:b****4 文档编号:3552456 上传时间:2022-11-23 格式:DOCX 页数:13 大小:1.02MB
下载 相关 举报
上大计算机视觉实验报告资料.docx_第1页
第1页 / 共13页
上大计算机视觉实验报告资料.docx_第2页
第2页 / 共13页
上大计算机视觉实验报告资料.docx_第3页
第3页 / 共13页
上大计算机视觉实验报告资料.docx_第4页
第4页 / 共13页
上大计算机视觉实验报告资料.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

上大计算机视觉实验报告资料.docx

《上大计算机视觉实验报告资料.docx》由会员分享,可在线阅读,更多相关《上大计算机视觉实验报告资料.docx(13页珍藏版)》请在冰豆网上搜索。

上大计算机视觉实验报告资料.docx

上大计算机视觉实验报告资料

实验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;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(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.根据实验结果截图显示有些时候并不能检测出人脸,尤其是有手、眼镜等等在脸前面的时候

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

当前位置:首页 > 医药卫生 > 药学

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

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