上大计算机视觉实验报告资料Word格式文档下载.docx
- 文档编号:16457781
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:13
- 大小:1.02MB
上大计算机视觉实验报告资料Word格式文档下载.docx
《上大计算机视觉实验报告资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《上大计算机视觉实验报告资料Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
D:
\\testttt.jpg"
pImg);
cvNamedWindow("
Myimage"
cvShowImage("
waitKey(5000);
return1;
b)
实验结果截图
c)结果分析
1.第一次主要是熟悉VS里面如何运用已有的openCV库函数来解决实际的问题
2.这次实验通过查阅书籍,我找到了在图片中快速插入文字的方法,即运用cv:
puttext函数还来解决,需要注意的是这个函数的参数,需要确定在图片中位置。
实验2
一.习题1.
a)实验代码
#include"
stdafx.h"
opencv.hpp"
#include<
iostream>
#ifdefined_DEBUG
#pragmacomment(lib,"
opencv_core249d.lib"
)
opencv_imgproc249d.lib"
opencv_highgui249d.lib"
#else
opencv_core249.lib"
opencv_imgproc249.lib"
opencv_highgui249.lib"
#endif
voidcopy_color(cv:
Mat&
image){
intnl=image.rows;
intnc=image.cols*image.channels()/2;
for(intj=0;
j<
nl;
j++)
{
uchar*data=image.ptr<
uchar>
(j);
for(inti=0;
i<
nc;
i++)
data[i]=data[nc+i];
}
}
1.jpg"
copy_color(image);
waitKey(50000);
b)实验结果截图
利用X和Y的两次循环将整块图片复制过去,裁减函数做得有欠缺。
实验3
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<
int>
(log(static_cast<
double>
(div))/log(2.0));
//maskusedtoroundthepixelvalue
ucharmask=0xFF<
<
n;
//e.g.fordiv=16,mask=0xF0
用移位的方法来进行乘除计算是一种高效的方法,如果我们限制缩减因子为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()函数,来检测是否存在没有使用额外像素填补的图像的情况,如果不存在使用这个函数能够使得遍历图像的速度更快——如果是连续的,就可以直接当作一维数组来处理。
方法八:
intnc=image.cols;
//numberofcolumns
与方法七类似,不同的是将nc直接赋值为列数,而不是方法七的intnc=image.cols*image.channels();
//totalnumberofelementsperline,来表示每行的像素点个数。
这样虽然计算次数变多了,但是由于计算量变少了,总体速度变快了。
方法九:
cv:
Mat_<
Vec3b>
iteratorit=image.begin<
();
iteratoritend=image.end<
调用cv:
Mat的模板迭代器的begin和end来表示图像的起始和终止位置,从而遍历整张图片,但由于是最原始的迭代器,计算效率不高,遍历图像速度慢。
方法十:
与方法九类似,不同的是增加位运算使得迭代的效率更高,速度更快。
方法十一:
cimage=image;
同样与方法九类似,通过调用cv:
Mat_的begin()和end()来处理,效率变低。
方法十二:
image.at<
(j,i)[0]=image.at<
(j,i)[0]/div*div+div/2;
(j,i)[1]=image.at<
(j,i)[1]/div*div+div/2;
(j,i)[2]=image.at<
(j,i)[2]/div*div+div/2;
通过图像矩阵的方法at(j,i)精确定位图像中的每一个点,这样图像颜色增减就能够方便地通过取每个点的RGB来完成操作,但是缺点也显而易见,对每个点操作需要浪费大量的空间和时间。
b)实验结果截图:
c)结果分析:
方法三和方法十相比方法一和方法九都增加了位运算,但是感觉上应该更加快,事实上却分别慢了6ms和3ms,这让我很意外。
我认为造成这种结果的原因可能是遍历图像的算法过于简单,致使没有使用到过多的位运算,体现不出位运算的优势。
方法七与方法八速度差不多,说明每次计算各行中的像素个数所需计算量不大,对运算结果的时间并没有造成很大的影响。
通过对比方法九和方法十一,可以发现调用cv:
Mat的内置迭代器和自己编写迭代器的运行速度有明显的区别。
实验4
一.习题1.
intmain()
{
Matfind=cv:
find.jpg"
0);
Matmap=cv:
img.jpg"
Matoutput=cv:
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));
Point(y+find.cols,x+find.rows);
Scalar(0,0,255);
}
}
resultofthecheck"
output);
waitKey(0);
}
1.本实验通过遍历图片,找图与find图片相似度大于99%的
2.比较主要通过相同的矩形框,利用双重循环遍历图片
实验5
#include<
opencv2/objdetect/objdetect.hpp>
opencv2/highgui/highgui.hpp>
opencv2/imgproc/imgproc.hpp>
opencv2/core/core.hpp>
stdio.h>
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;
};
eyes_cascade.load(eyes_cascade_name)){printf("
//--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<
Rect>
faces;
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;
faces.size();
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:
eyes;
//--Ineachface,detecteyes
eyes_cascade.detectMultiScale(faceROI,eyes,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
for(size_tj=0;
eyes.size();
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);
1.实验代码是从网上下载稍加修改的,主要取自opencv官网的教材
2.根据实验结果截图显示有些时候并不能检测出人脸,尤其是有手、眼镜等等在脸前面的时候
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 视觉 实验 报告 资料