Banana对《Learning OpenCV》的笔记(7)
-
第8页
OpenCV在VC6.0下的安装与配置 安装OpenCV 从http://www.opencv.org.cn 下载OpenCV安装程序。假如要将OpenCV安装到C:\Program Files\OpenCV。在安装时选择"将\OpenCV\bin加入系统变量"(Add\OpenCV\bin to the systerm PATH)。(所使用的的版本为OpenCV1.0) 配置Windows环境变量 检查C:\Program Files\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入。加入后需要注销当前Windows用户(或重启)后重新登陆才生效。(可以在任务管理器里重启explorer.exe) 配置Visual C++ 6.0 全局设置 菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径: C:\Program Files\OpenCV\lib 然后选择include files,在下方填入路径: C:\Program Files\OpenCV\cxcore\include C:\Program Files\OpenCV\cv\include C:\Program Files\OpenCV\cvaux\include C:\Program Files\OpenCV\ml\include C:\Program Files\OpenCV\otherlibs\highgui C:\Program Files\OpenCV\otherlibs\cvcam\include 然后选择source files,在下方填入路径: C:\Program Files\OpenCV\cv\src C:\Program Files\OpenCV\cxcore\src C:\Program Files\OpenCV\cvaux\src C:\Program Files\OpenCV\otherlibs\highgui C:\Program Files\OpenCV\otherlibs\cvcam\src\windows 最后点击“ok”,完成设置。 项目设置 每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上 cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib
-
第50页
一个简单的显示图像程序 #include "highgui.h" int main( int argc, char** argv ) { IplImage* img = cvLoadImage( argv[1] ); cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE ); cvShowImage("Example1", img ); cvWaitKey(0); cvReleaseImage( &img ); cvDestroyWindow("Example1"); } 程序的含义很简单,书中有详细的解释,这里主要写一下程序编译后如何来运行,以及Main函数中参数argc,argv的含义。 这里将程序存放在桌面名为Tests的文件夹中,工程名为test,执行指令如下:
这里就涉及了Main函数的两个参数的问题,两个参数的作用是什么呢?argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。以上图为例,程序名为test.exe,在命令行运行该程序(首先应该在命令行下用 cd 命令进入到 teat.exe 文件所在目录)。 那么argc的值为2,argv[0]是“test.exe”,argv[1]是“clockA.bmp”。 程序的运行结果如下图:
下面是OpenCV中文网站上对这两个参数的实例解释: 下面的程序演示argc和argv的使用: #include <stdio.h> int main(int argc, char ** argv) { int i; for (i=0; i < argc; i++) printf("Argument %d is %s.\n", i, argv[i]); return 0; } 假如上述代码编译为hello.exe,那么运行 hello.exe a b c d e 将得到 Argument 0 is hello.exe. Argument 1 is a. Argument 2 is b. Argument 3 is c. Argument 4 is d. Argument 5 is e. 运行 hello.exe lena.jpg 将得到 Argument 0 is hello.exe. Argument 1 is lena.jpg.
-
初探OpenCV
利用OpenCV实现简单的图像融合(将两幅图像进行加权平均)
#include <cv.h> #include <highgui.h> #include <iostream.h> int main(int argc, char** argv) { IplImage *src1, *src2; if( argc==9 && ((src1=cvLoadImage(argv[1],1)) != 0) && ((src2=cvLoadImage(argv[2],1)) !=0 )) { int x = atoi(argv[3]); int y = atoi(argv[4]); int width = atoi(argv[5]); int height = atoi(argv[6]); double alpha = (double)atof(argv[7]); double beta = (double)atof(argv[8]); cvSetImageROI(src1, cvRect(x,y,width,height)); cvSetImageROI(src2, cvRect(x,y,width,height)); cvAddWeighted(src1, alpha, src2, beta, 0.0, src1); cvResetImageROI(src1); cvNamedWindow( "Alpha_blend", 1); cvShowImage( "Alpha_blend", src1); cvWaitKey(); } else cout<<"Couldn't load one or both of "<<argv[1]<<","<<argv[2]<<endl; return 0; }
程序编译完成后输入指令:test.exe clockA.bmp clockB.bmp 0 0 512 512 0.5 0.5 两幅待融合的原图像:
加权平均后的图像:
-
Opencv2.3在vs2010中的配置
Opencv 2.3 superpack版本在Visual Studio 2010下的配置 opencv下载地址http://www.opencv.org.cn/index.php/Download 这里默认Opencv安装在D盘。 一、设置环境变量: 我的电脑--->右键--->属性--->高级--->环境变量--->在用户变量里,新建path和OPENCV两个项 步骤1:在path中添加D:\Program Files\OpenCV2.3\build\x86\vc10\bin,就是添加dll文件 步骤2:添加OPENCV的环境变量D:\Program Files\OpenCV2.3\build 二、打开一个Opencv的工程,点菜单目录的“视图”--->属性管理器--->双击项目名称 步骤3:在配置属性--->VC++目录--->包含目录文件中添加 D:\Program Files\OpenCV2.3\build\include D:\Program Files\OpenCV2.3\build\include\opencv D:\Program Files\OpenCV2.3\build\include\opencv2 步骤4::在配置属性--->VC++目录--->库目录中添加 D:\Program Files\OpenCV2.3\build\x86\vc10\lib 步骤5 添加lib库文件, 在配置debug里--->项目属性--->链接器--->输入--->附加依赖库 里加上 opencv_core230d.lib opencv_highgui230d.lib opencv_video230d.lib opencv_ml230d.lib opencv_legacy230d.lib opencv_imgproc230d.lib 步骤6:在配置release里--->项目属性--->链接器--->输入--->附加依赖库 里加上 opencv_core230.lib opencv_highgui230.lib opencv_video230.lib opencv_ml230.lib opencv_legacy230.lib opencv_imgproc230.lib
-
图像处理
对lena、baboon图像进行阈值分割,像素大于100的被赋值为255,小于100被赋为0.
#include <stdio.h> #include <cv.h> #include <highgui.h> void sum_rgb( IplImage* src, IplImage* dst ) { // Allocate individual image planes. IplImage* r = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); IplImage* g = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); IplImage* b = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); // Temporary storage. IplImage* s = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1 ); // Split image onto the color planes. cvSplit( src, r, g, b, NULL ); // Add equally weighted rgb values. cvAddWeighted( r, 1./3., g, 1./3., 0.0, s ); cvAddWeighted( s, 2./3., b, 1./3., 0.0, s ); // Truncate values above 100. cvThreshold( s, dst, 100, 255, CV_THRESH_BINARY ); cvReleaseImage( &r ); cvReleaseImage( &g ); cvReleaseImage( &b ); cvReleaseImage( &s ); } int main(int argc, char** argv) { // Create a named window with a the name of the file. cvNamedWindow( argv[1], 1 ); // Load the image from the given file name. IplImage* src = cvLoadImage( argv[1] ); IplImage* dst = cvCreateImage( cvGetSize(src), src->depth, 1); sum_rgb( src, dst); // Show the image in the named window cvShowImage( argv[1], dst ); // Idle until the user hits the "Esc" key. while( 1 ) { if( (cvWaitKey( 10 )&0x7f) == 27 ) break; } // Clean up and don’t be piggies cvDestroyWindow( argv[1] ); cvReleaseImage( &src ); cvReleaseImage( &dst ); return 0; }
-
图像变换
利用OpenCV实现图像的仿射变换 仿射变换可以形象的表示成如下形式:一个平面内任意的平行四边形ABCD可以被仿射变换映射为另一个平行四边形A'B'C'D',如果四边形的面积不等于0,仿射变换就被这两个平行四边形(其中的三个顶点)唯一的定义,这里注意确定一个平行四边形只需要三个顶点。我们可以把仿射变换想象成把一幅图像画到一个胶板上,在胶板的角上推或拉以得到不同的平行四边形。 下面的程序实现了对图像的仿射变换,还包括图像旋转、缩放这两个重要的子集。
#include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream.h> int main( int argc, char** argv ) { CvPoint2D32f srcTri[3],dstTri[3]; CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 ); CvMat* warp_mat = cvCreateMat( 2, 3, CV_32FC1 ); IplImage *src, *dst, *srcBak, *dstBak; int TLx = 0, TLy = 0, TRx = 0, TRy = 0, DLx = 0, DLy = 0; double angle = 40, scale = 0.8; float delta = 0.01; int PressKey; char name[1][80]; if(!(src=cvLoadImage("C:/Users/jinxing/Desktop/Tests/test/Debug/lena.bmp",1)) ) { printf("Input Error\n"); return -1; } srcTri[0].x = 0;// Top left srcTri[0].y = 0; srcTri[1].x = src->width-1;//Top right srcTri[1].y = 0; srcTri[2].x = 0;//Down left srcTri[2].y = src->height-1; dst = cvCloneImage(src); srcBak = cvCloneImage(src); cvCopy(src,srcBak); dst->origin = src->origin; cvZero(dst); cvNamedWindow( "AffineTransform", 1 ); CvFont font = cvFont( 1, 1 ); while(1) { dstTri[0].x = srcBak->width*delta*(TLx%101); dstTri[0].y = srcBak->height*delta*(TLy%101); dstTri[1].x = srcBak->width-1 - srcBak->width*delta*(TRx%101); dstTri[1].y = srcBak->height*delta*(TRy%101); dstTri[2].x = srcBak->width*delta*(DLx%101); dstTri[2].y = srcBak->height-1 - srcBak->height*delta*(DLy%101); cvGetAffineTransform(srcTri,dstTri,warp_mat); cvWarpAffine(srcBak,dst,warp_mat); cvCopy(dst,src); CvPoint2D32f center = cvPoint2D32f(src->width/2,src->height/2); cv2DRotationMatrix(center,angle,scale,rot_mat); cvWarpAffine(src,dst,rot_mat); dstBak = cvCloneImage(dst); cvCopy(dst,dstBak); //--------------------------字符显示--------------------------------// char buf[8]; char dspStr1[32] = {'|'}; char dspStr2[32] = {'|'}; char dspStr3[32] = {'|'}; char dspStr4[32] = {'|'}; memset(buf,'/0',sizeof(buf)); strcat(dspStr1,itoa(TLx%101,buf,10)); strcat(dspStr1,","); strcat(dspStr1,itoa(TLy%101,buf,10)); strcat(dspStr1,"|TL"); strcat(dspStr2,"angle="); strcat(dspStr2,itoa(int(angle),buf,10)); strcat(dspStr2,",scale="); strcat(dspStr2,itoa(int(scale*100),buf,10)); strcat(dspStr2,"%|"); strcat(dspStr3,itoa(TRx%101,buf,10)); strcat(dspStr3,","); strcat(dspStr3,itoa(TRy%101,buf,10)); strcat(dspStr3,"|TR"); strcat(dspStr4,itoa(DLx%101,buf,10)); strcat(dspStr4,","); strcat(dspStr4,itoa(DLy%101,buf,10)); strcat(dspStr4,"|DL"); cvPutText(dst,dspStr1,cvPoint(dst->width-120,20),&font,cvScalar(0,0xff)); cvPutText(dst,dspStr2,cvPoint(dst->width-180,80),&font,cvScalar(0,0xff)); cvPutText(dst,dspStr3,cvPoint(dst->width-120,40),&font,cvScalar(0,0xff)); cvPutText(dst,dspStr4,cvPoint(dst->width-120,60),&font,cvScalar(0,0xff)); //---------------------------------------------------------------------// cvShowImage( "AffineTransform", dst ); PressKey = cvWaitKey(); printf("%c is pressed\n",PressKey); switch(PressKey) { case '1': TLx++; break; case 'q': TLx--; break; case '2': TLy++; break; case 'w': TLy--; break; case '3': TRx++; break; case 'e': TRx--; break; case '4': TRy++; break; case 'r': TRy--; break; case '5': DLx++; break; case 't': DLx--; break; case '6': DLy++; break; case 'y': DLy--; break; case '7': angle++; break; case 'u': angle--; break; case '8': scale+=0.01; break; case 'i': scale-=0.01; break; case 27: cvReleaseImage(&dst); cvDestroyWindow("AffineTransform"); cvReleaseMat(&rot_mat); cvReleaseMat(&warp_mat); return 0; case 's': cout<<"Input the filename:"<<endl; cin>>name[0]; cvSaveImage( name[0], dstBak ); cout<<name[0]<<" is saved."<<endl; break; default: cout<<"Input Error."<<endl; cout<<"Input 1 2 3 4 5 6 7 8 q w e r t y to change the coordinate."<<endl<< "Input u and i to change the angle and scale."<<endl<<"Input s to save the image."<<endl <<"Input the esc to quit."<<endl; break; } } cvDestroyWindow("AffineTransform"); cvReleaseImage(&dst); cvReleaseMat(&rot_mat); cvReleaseMat(&warp_mat); return 0; }
程序的执行结果:
程序执行后,可自己调节三个顶点的坐标,以获得不同的对应关系,即可得到不同的仿射变换矩阵(大小为2×3)。还可调节旋转角度以及缩放尺度。
-
轮廓
一个简单的提取飞机目标图像(二值图)轮廓的程序
#include <cv.h> #include <highgui.h> #include <iostream.h> #include <stdio.h> IplImage* g_image = NULL; IplImage* g_gray =NULL; int g_thresh = 100; CvMemStorage* g_storage = NULL; char name[1][80]; int Presskey; int main( int argc, char** argv ) { if( argc==2 && ( g_image = cvLoadImage( argv[1], 1 ) ) != 0 ) { cvNamedWindow( "Contours", 1 ); if( g_storage == NULL ) { g_gray = cvCreateImage( cvGetSize(g_image), 8, 1 ); g_storage = cvCreateMemStorage(0); } else { cvClearMemStorage( g_storage ); } CvSeq* contours = 0; cvCvtColor( g_image, g_gray, CV_BGR2GRAY ); //cvThreshold( g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY ); cvFindContours( g_gray, g_storage, &contours ); cvZero( g_gray ); if( contours ) { cvDrawContours( g_gray, contours, cvScalarAll(255), cvScalarAll(255), 1); } cvShowImage( "Contours", g_gray ); Presskey=cvWaitKey(); printf("%c is pressed\n",Presskey); switch( Presskey ) { case 's': cout<<"The image is going to be saved, please input the name:"<<endl; cin>>name[0]; cvSaveImage( name[0], g_gray ); break; default: break; } cvDestroyWindow( "Contours" ); cvReleaseImage( &g_image ); cvReleaseImage( &g_gray ); } else return -1; return 0; }
使用F15战机的二值图像进行了实验,下面是原图和结果图: