Banana对《Learning OpenCV》的笔记(7)

Learning OpenCV
  • 书名: Learning OpenCV
  • 作者: Gary Bradski/Adrian Kaehler
  • 副标题: Computer Vision with the OpenCV Library
  • 页数: 575
  • 出版社: O'Reilly Media
  • 出版年: 2008-10-4
  • 第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

    2011-11-13 14:51:31 回应
  • 第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.

    2011-11-13 15:27:16 1人喜欢 回应
  • 初探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 两幅待融合的原图像:

    clockA.bmp
    clockB.bmp

    加权平均后的图像:

    融合图像
    2011-11-13 16:41:40 4人喜欢 2回应
  • 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

    2011-11-16 20:05:40 回应
  • 图像处理

    对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;
    }

    2011-11-16 20:03:07 回应
  • 图像变换

    利用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)。还可调节旋转角度以及缩放尺度。

    2011-11-17 21:51:10 回应
  • 轮廓

    一个简单的提取飞机目标图像(二值图)轮廓的程序

    #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战机的二值图像进行了实验,下面是原图和结果图:

    2011-11-23 20:55:08 3人喜欢 1回应

Banana的其他笔记  · · · · · ·  ( 全部8条 )