1、学习opencv123章部分习题参考程序习题解答 2.1 利用Microsoft Visual Studio 2010打开D:OpenCV2.1VS2010 OpenCV.sln文件,如图1示。在“Solution Configuration”下选择“Debug”模式,右击解决方案,选择“Build Solution”进行编译,编译结束后结果显示如图2示。再次右击文件“INSTALL”,选择“Rebuild Solution”进行再编译,编译后结果显示如图3示。同理,“Release”模式和“Debug”模式操作相同(示图略)。这样就产生了“Debug”和“Release”两个版本的库文件。图
2、1 载入解决方案OpenCV.sln图2 编译解决方案图3 再编译INSTALL2.2创建工程:Move实验,导入文件lkdemo.c,如图4示。在PC机上安装摄像头,编译工程,运行程序如图5示。键入“r”后显示图像如图6示;键入“n”后显示图像如图7示。图4 创建工程图5 运行程序结果显示图6 跟踪初始化显示图7 夜间模式跟踪2.3 #include cv.h#include highgui.hIplImage *DoPyDown(IplImage *in,int fliter = IPL_GAUSSIAN_5x5);main(int argc, char *argv) CvCapture
3、* 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 = cvQueryF
4、rame(capture); double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS); /得到要写入视频的宽高数据 CvSize size = cvSize(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH)/2, (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)/2 ); /下一句创建一个写入设备以便将视频流写入视频文件 CvVideoWriter* writer = cvCreateVideo
5、Writer(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_L
6、INEAR+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*/); /等待键盘事件 char c=cvWaitKey(1); if
7、 (27=c) break; /释放资源 cvReleaseVideoWriter(&writer); cvReleaseImage(&bgr_frame); cvReleaseImage(&OutImage); cvReleaseCapture(&capture); /销毁窗口 cvDestroyWindow(AVI_Example); return(0);/自定义函数的实现IplImage *DoPyDown(IplImage *in,int fliter/* = IPL_GAUSSIAN_5x5*/) IplImage *out=cvCreateImage( cvSize(in-widt
8、h/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文件#pragma comment(lib,cv.lib)#pragma comment(lib,cvcam.lib)#pragma comment(lib,cxcore.lib)#pragma comment(lib,highgui.lib)int main(int
9、 argc,char*argv) printf(* a:给定一个负数,求其绝对值,四舍五入之后,求其极值n); double fushu = -12.6345; printf(给定的数:%fn,fushu); double f=fabs(fushu); printf(其绝对值:%fn,f); /四舍五入之后:cvRound()函数, int m = cvRound(f); printf(四舍五入之后:%dn,m); printf(n* b:产生一些随机数:n); int rng; CvRNG rng = cvRNG(); for (int i=0;i50;i+) /调用cvRandInt()函
10、数,产生随机数 printf(%d ,(uchar)cvRandInt(&rng); printf(n); /* c Cvpoint2D32f类型到 CvPoint 类型的转换 printf(n* c: Cvpoint2D32f 类型到 CvPoint 类型的转换:n); CvPoint2D32f cpf; cpf=cvPoint2D32f(34.23564423,64.2545656); printf(%f,%fn,cpf.x,cpf.y); CvPoint cp=cvPointFrom32f(cpf); printf(%d,%dn,cp.x,cp.y); /* d CvPoint 类型到
11、CvPoint2D32f类型的转换 printf(n* d:CvPoint类型到 CvPoint2D32f类型的转换:n); /定义CvPoint类型变量并调用构造函数初始化 CvPoint point=cvPoint(234,53); printf(转换前的数据:%d,%dn,point.x,point.y); /把CvPoint类型转换为CvPoint2D32f类型:cvPointTo2D32f函数 CvPoint2D32f cpoint=cvPointTo32f(point); printf(转换后的数据:%f,%fnn,cpoint.x,cpoint.y); return 0;3.2
12、源代码如下:#include #include int main()/ IplImage* srcImg = NULL; CvMat* srcMat = cvCreateMat(100, 100, CV_8UC3); /100*100 3通道字节型 cvSetZero(srcMat); /清零 CvPoint cirPoint = cvPoint(50, 50); /圆心 int radius = 40;/半径 CvScalar cirColor = cvScalar(255, 0,0 );/蓝色 cvCircle(srcMat, cirPoint, radius, cirColor); /画
13、圆 cvNamedWindow(Exam302); cvShowImage(Exam302, (IplImage*)srcMat); cvWaitKey(0); cvReleaseMat(&srcMat); cvDestroyWindow(Exam302); return 0;编译运行结果如图8示。图8 绘制图形3.3源代码如下:#include #include int main() CvMat* srcMat = cvCreateMat(100, 100, CV_8UC3); /100*100 cvZero(srcMat); cvRectangle(IplImage*)srcMat, cv
14、Point(20, 5), cvPoint(40, 20), cvScalar(0, 255, 0); cvNamedWindow(Rectangle); cvShowImage(Rectangle, srcMat); cvWaitKey(0); cvReleaseMat(&srcMat); cvDestroyWindow(Rectangle); return 0;编译运行结果如图9示。图9 绘制矩形3.5源代码如下:#include cv.h#include highgui.hint main() IplImage* single_img = cvCreateImage(cvSize(210
15、, 210), 8, 1);/210*210 单通道 cvZero(single_img); int Width = 210, Height = 210; int maxPixel =200; int value = 0; int i, 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); /set the ROI of the single_img / cvSetImageROI
16、(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); cvReleaseIm
17、age(&single_img); return 0;编译运行结果如图10示。图10 ROI3.7 源代码如下:#include #include int main() char* filePath = D:/图片库/Baboon.jpg; IplImage* srcImg = cvLoadImage(filePath); /load the image if(!srcImg) printf(cannot open the file.n); return -1; IplImage* rImg = cvCreateImage(cvGetSize(srcImg), srcImg-depth, 1)
18、; 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); double g
19、reen_maxPixel = 0; double green_minPixel = 0; /绿色平面最大最小值 double thresh; /阈值thresh cvSplit(srcImg, rImg, gImg, bImg, 0); /拆分3通道 /-a小题 - cvNamedWindow(GreenImage0); cvShowImage(GreenImage0, gImg); /-b小题- cvCopy(gImg, clone1); cvCopy(gImg, clone2); /copy the gImg to clone1 and clone2 /-c小题求绿色平面最大最小值- c
20、vMinMaxLoc(gImg, &green_maxPixel, &green_minPixel); /-d小题- thresh = (unsigned char)(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); return 0;编译运行结果如图11示。图11注:本实验环境在Microsoft Visual C+2010,Opencv2.2下完成
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1