《学习opencv》123章部分习题参考程序.docx
《《学习opencv》123章部分习题参考程序.docx》由会员分享,可在线阅读,更多相关《《学习opencv》123章部分习题参考程序.docx(15页珍藏版)》请在冰豆网上搜索。
《学习opencv》123章部分习题参考程序
习题解答
2.1利用MicrosoftVisualStudio2010打开D:
\OpenCV2.1\VS2010\OpenCV.sln文件,如图1示。
在“SolutionConfiguration”下选择“Debug”模式,右击解决方案,选择“BuildSolution”进行编译,编译结束后结果显示如图2示。
再次右击文件“INSTALL”,选择“RebuildSolution”进行再编译,编译后结果显示如图3示。
同理,“Release”模式和“Debug”模式操作相同(示图略)。
这样就产生了“Debug”和“Release”两个版本的库文件。
图1载入解决方案OpenCV.sln
图2编译解决方案
图3再编译INSTALL
2.2创建工程:
Move实验,导入文件lkdemo.c,如图4示。
在PC机上安装摄像头,编译
工程,运行程序如图5示。
键入“r”后显示图像如图6示;键入“n”后显示图像如图7示。
图4创建工程
图5运行程序结果显示
图6跟踪初始化显示
图7夜间模式跟踪
2.3
#include"cv.h"
#include"highgui.h"
IplImage*DoPyDown(IplImage*in,intfliter=IPL_GAUSSIAN_5x5);
main(intargc,char**argv)
{
CvCapture*capture=0;
//创建窗口,显示缩放前的文件
cvNamedWindow("AVI_Example",1);
//创建窗口,显示缩放后的文件
cvNamedWindow("AVI_After");
//选择是从摄像头中读取还是从文件中读取
if(argc==1)
{
capture=cvCreateCameraCapture(0);
}
else
{
capture=cvCreateFileCapture("m.avi");
}
assert(capture!
=NULL);//和下一句if作用相同
if(!
capture)
{
return-1;
}
IplImage*bgr_frame=cvQueryFrame(capture);
doublefps=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
//得到要写入视频的宽高数据
CvSizesize=cvSize(((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH))/2,
((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT))/2
);
//下一句创建一个写入设备以便将视频流写入视频文件
CvVideoWriter*writer=cvCreateVideoWriter("lgc.avi",-1,fps,size);
IplImage*OutImage;
IplImage*logpolar_frame=cvCreateImage(size,IPL_DEPTH_8U,3);
//判断逐帧读取是否为空(是否读完)
while((bgr_frame=cvQueryFrame(capture))!
=NULL)
{
//对视频进行转换,用此函数后录制的文件变形
cvLogPolar(bgr_frame,logpolar_frame,
cvPoint2D32f(bgr_frame->width/2,bgr_frame->height/2),
40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS
);
OutImage=DoPyDown(bgr_frame);
//对图像进行翻转
cvConvertImage(OutImage,OutImage,CV_CVTIMG_FLIP);
//将处理后的视频写入文件
cvWriteFrame(writer,OutImage);
//显示视频
cvShowImage("AVI_Example",bgr_frame);
//显示缩放后的视频
cvShowImage("AVI_After",OutImage/*logpolar_frame*/);
//等待键盘事件
charc=cvWaitKey
(1);
if(27==c)
{
break;
}
}
//释放资源
cvReleaseVideoWriter(&writer);
cvReleaseImage(&bgr_frame);
cvReleaseImage(&OutImage);
cvReleaseCapture(&capture);
//销毁窗口
cvDestroyWindow("AVI_Example");
return(0);
}
//自定义函数的实现
IplImage*DoPyDown(IplImage*in,intfliter/*=IPL_GAUSSIAN_5x5*/)
{
IplImage*out=cvCreateImage(
cvSize(in->width/2,in->height/2),
in->depth,
in->nChannels);
cvPyrDown(in,out,IPL_GAUSSIAN_5x5);
return(out);
}
3.1
#include"stdio.h"
#include"cxcore.h"
#include"cv.h"
#include"cxtypes.h"
//连接lib文件
#pragmacomment(lib,"cv.lib")
#pragmacomment(lib,"cvcam.lib")
#pragmacomment(lib,"cxcore.lib")
#pragmacomment(lib,"highgui.lib")
intmain(intargc,char**argv)
{
printf("***a:
给定一个负数,求其绝对值,四舍五入之后,求其极值\n");
doublefushu=-12.6345;
printf("给定的数:
%f\n",fushu);
doublef=fabs(fushu);
printf("其绝对值:
%f\n",f);
//四舍五入之后:
cvRound()函数,
intm=cvRound(f);
printf("四舍五入之后:
%d\n",m);
printf("\n***b:
产生一些随机数:
\n");
intrng;
CvRNGrng=cvRNG();
for(inti=0;i<50;i++)
{
//调用cvRandInt()函数,产生随机数
printf("%d",(uchar)cvRandInt(&rng));
}
printf("\n");
//***cCvpoint2D32f类型到CvPoint类型的转换
printf("\n***c:
Cvpoint2D32f类型到CvPoint类型的转换:
\n");
CvPoint2D32fcpf;
cpf=cvPoint2D32f(34.23564423,64.2545656);
printf("%f,%f\n",cpf.x,cpf.y);
CvPointcp=cvPointFrom32f(cpf);
printf("%d,%d\n",cp.x,cp.y);
//***dCvPoint类型到CvPoint2D32f类型的转换
printf("\n***d:
CvPoint类型到CvPoint2D32f类型的转换:
\n");
//定义CvPoint类型变量并调用构造函数初始化
CvPointpoint=cvPoint(234,53);
printf("转换前的数据:
%d,%d\n",point.x,point.y);
//把CvPoint类型转换为CvPoint2D32f类型:
cvPointTo2D32f函数
CvPoint2D32fcpoint=cvPointTo32f(point);
printf("转换后的数据:
%f,%f\n\n",cpoint.x,cpoint.y);
return0;
}
3.2源代码如下:
#include
#include
intmain()
{
//IplImage*srcImg=NULL;
CvMat*srcMat=cvCreateMat(100,100,CV_8UC3);//100*1003通道字节型
cvSetZero(srcMat);//清零
CvPointcirPoint=cvPoint(50,50);//圆心
intradius=40;//半径
CvScalarcirColor=cvScalar(255,0,0);//蓝色
cvCircle(srcMat,cirPoint,radius,cirColor);//画圆
cvNamedWindow("Exam302");
cvShowImage("Exam302",(IplImage*)srcMat);
cvWaitKey(0);
cvReleaseMat(&srcMat);
cvDestroyWindow("Exam302");
return0;
}
编译运行结果如图8示。
图8绘制图形
3.3
源代码如下:
#include
#include
intmain()
{
CvMat*srcMat=cvCreateMat(100,100,CV_8UC3);//100*100
cvZero(srcMat);
cvRectangle((IplImage*)srcMat,cvPoint(20,5),cvPoint(40,20),cvScalar(0,255,0));
cvNamedWindow("Rectangle");
cvShowImage("Rectangle",srcMat);
cvWaitKey(0);
cvReleaseMat(&srcMat);
cvDestroyWindow("Rectangle");
return0;
}
编译运行结果如图9示。
图9绘制矩形
3.5
源代码如下:
#include"cv.h"
#include"highgui.h"
intmain()
{
IplImage*single_img=cvCreateImage(cvSize(210,210),8,1);//210*210单通道
cvZero(single_img);
intWidth=210,Height=210;
intmaxPixel=200;
intvalue=0;
inti,j;
for(i=0,j=0;i<=Width,j<=Height;)
{
//for(i=0;i<=Width;)
//{
cvSetImageROI(single_img,cvRect(i,j,Width-i,Height-j));//settheROIofthesingle_img
//cvSetImageROI(single_img,cvRect(0,0,Width,Height));
cvSet(single_img,cvScalar(value,0,0));
value+=20;
cvResetImageROI(single_img);
//}
i+=10;//边界都为10个像素宽度
j+=10;
if(value==maxPixel)//超过最大像素值200时,退出
{
break;
}
}
cvNamedWindow("ROI",0);
cvShowImage("ROI",single_img);
cvWaitKey(0);
cvDestroyWindow("ROI");
cvReleaseImage(&single_img);
return0;
}
编译运行结果如图10示。
图10ROI
3.7
源代码如下:
#include
#include
intmain()
{
char*filePath="D:
/图片库/Baboon.jpg";
IplImage*srcImg=cvLoadImage(filePath);//loadtheimage
if(!
srcImg)
{
printf("cannotopenthefile...\n");
return-1;
}
IplImage*rImg=cvCreateImage(cvGetSize(srcImg),srcImg->depth,1);
IplImage*gImg=cvCreateImage(cvGetSize(srcImg),srcImg->depth,1);
IplImage*bImg=cvCreateImage(cvGetSize(srcImg),srcImg->depth,1);//创建单通道r,g,b图像
IplImage*clone1=cvCreateImage(cvGetSize(srcImg),srcImg->depth,1);
IplImage*clone2=cvCreateImage(cvGetSize(srcImg),srcImg->depth,1);
doublegreen_maxPixel=0;
doublegreen_minPixel=0;//绿色平面最大最小值
doublethresh;//阈值thresh
cvSplit(srcImg,rImg,gImg,bImg,0);//拆分3通道
//-------------------a小题------------------
cvNamedWindow("GreenImage0");
cvShowImage("GreenImage0",gImg);
//-------------------b小题---------------------
cvCopy(gImg,clone1);
cvCopy(gImg,clone2);//copythegImgtoclone1andclone2
//-----------------c小题求绿色平面最大最小值-----------------
cvMinMaxLoc(gImg,&green_maxPixel,&green_minPixel);
//-------------------d小题-------------------------------
thresh=(unsignedchar)(green_maxPixel-green_minPixel)/2.0;
cvSet(clone1,cvScalar(thresh));
//----------------------e小题-----------------------
cvZero(clone2);
cvCmp(gImg,clone1,clone2,CV_CMP_GE);//---------------------------f小题-------------------
cvSubS(gImg,cvScalar(thresh/2),gImg,clone2);
cvNamedWindow("GreenImage1");
cvShowImage("GreenImage1",gImg);
cvWaitKey(0);
cvReleaseImage(&srcImg);
cvReleaseImage(&rImg);
cvReleaseImage(&gImg);
cvReleaseImage(&bImg);
cvDestroyWindow("GreenImage0");
cvDestroyWindow("GreenImage1");
return0;
}
编译运行结果如图11示。
图11
注:
本实验环境在MicrosoftVisualC++2010,Opencv2.2下完成