注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

*^^* 寂寞的whitebaby

欢迎来到我的家,充满回忆的地方

 
 
 

日志

 
 
关于我

いǒDê個性伱惹吥起                 ヤ 無限囂張.習慣寂寞‰〆┈

从图学起OpenCV (C)  

2012-06-19 14:14:05|  分类: openCV |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
//转换示例   
void ConvertSample()  
{  
    IplImage *imgSrc = NULL;  
    printf( "Convert Scale Sample\n" );  
    printf( "Please Input Image Filename:" );  
    char filename[FILENAME_MAX] = { 0 };  
  
    scanf_s( "%s" , filename , FILENAME_MAX );  
  
    imgSrc = cvLoadImage( filename );  
  
    cvNamedWindow( "Source Image" );  
    cvShowImage( "Source Image" , imgSrc );  
  
    IplImage *imgDst = cvCloneImage( imgSrc );  
    cvConvertScale( imgSrc , imgDst , 0.5 , 2  );  
  
    cvNamedWindow( "ConvertScale" );  
    cvShowImage( "ConvertScale" , imgDst );  
 
    printf( "Convert To Gray Image" );  
    IplImage *imgGray = cvCreateImage( cvGetSize( imgSrc ) , imgSrc->depth , 1 );  
 
    cvCvtColor( imgSrc ,  imgGray , CV_RGB2GRAY );  
    cvNamedWindow( "Gray Color" );  
    cvShowImage( "Gray Color" , imgGray );  
 
    printf( "计算特征值和特征向量\n" );  
    int arr[] = { 2 , 2 , 2 , 2 };  
    CvMat *mat = cvCreateMatHeader( 2 , 2 , CV_32FC1 );  
    cvInitMatHeader( mat , 2 , 2 , CV_32SC1 , arr );  
    CvMat evects = cvMat( 1 , 2  , CV_32FC1 );  
    cvInitMatHeader( &evects , 1 , 2 , CV_32FC1 );  
    CvMat evals = cvMat( 1 , 2 ,CV_32FC1 );  
    cvInitMatHeader( &evals , 1 , 2 , CV_32FC1 );  
    //cvEigenVV( mat , &evects , &evals , 0 );   
  
    if ( cvWaitKey( 0 )  ==  's' )  
    {  
        ;  
    }  
  
    cvDestroyWindow( "ConvertScale" );  
    cvDestroyWindow( "Gray Color" );  
    cvDestroyWindow( "Source Image" );  
    cvReleaseImage( &imgDst );  
    cvReleaseImage( &imgSrc );  
    cvReleaseImage( &imgGray );  
}  
  
//旋转示例   
void FilpSample()  
{  
    printf( "旋转图像\n" );  
    printf( "请输入图像位置或者图像名称:" );  
    char filename[FILENAME_MAX] = { 0 };  
  
    scanf_s( "%s" , filename , FILENAME_MAX );  
    IplImage *imgSrc = cvLoadImage( filename );  
  
    cvNamedWindow( "原图" );  
    cvShowImage( "原图" , imgSrc );  
  
    IplImage *imgDst = cvCloneImage( imgSrc );  
    if ( NULL  == imgDst  )  
    {  
        printf( "NULL\n" );  
    }  
  
    //特别要注意cvFilp的参数!!   
    //第二个参数为NULL为直接对原图进行旋转,若第二个参数不为NULL则会将结果给第二个参数所指向的内存空间   
    cvFlip( imgDst , NULL , 0 );  
    cvNamedWindow( "旋转之后的图" );  
    cvShowImage( "旋转之后的图", imgDst );  
  
    while ( 1 )  
    {  
        if ( cvWaitKey( 0 ) == 's' )  
        {  
            break;  
        }  
    }  
 
    cvDestroyAllWindows();  
    cvReleaseImage( &imgSrc );  
    cvReleaseImage( &imgDst ); 
}  
  
//绘图示例   
void DrawSample()  
{  
    printf("Draw Ellipse\n");  
    IplImage *img = cvCreateImage( cvSize( 500 , 500 ) , 16 , 3 );  
     
    printf( "画线\n" );  
    //其中的第二个和第三个为起始点和终止点坐标   
    cvLine( img , cvPoint( 0 ,0 ) , cvPoint( 500 , 500 ) , cvScalar( 255 , 0 , 0 ,0 ) , 1 , 8  ,0 );  
    cvNamedWindow( "Line" );  
    cvShowImage( "Line" , img );  
  
    printf( "椭圆形\n" );  
    cvEllipse( img , cvPoint( 250 , 250 ) , cvSize( 100 , 150 ) , 120 , 0 , 360 , cvScalar( 255 , 0  , 0 )  );  
    cvNamedWindow( "Ellipse" );  
    cvShowImage( "Ellipse" , img  );  
  
    printf( "多边形\n" );  
  
    //设置指针数组用来存放点的坐标   
    CvPoint **pt = new CvPoint*[1];  
    pt[0] = new CvPoint[4];  
    pt[0][0] = cvPoint( 120 , 120 );  
    pt[0][1] = cvPoint( 240 , 240 );  
    pt[0][2] = cvPoint( 450 , 320 );  
    pt[0][3] = cvPoint( 100 , 45 );  

    int count = 4;  
    //第一个参数为图像 , 第二个参数为点的指针 , 第三个参数为d点数组的个数   
    //第四个为线段个数,第五个为是否闭合第六个为线段颜色   
    cvPolyLine( img , pt , &count , 1 , TRUE ,cvScalar(  255 , 0 ,0  ) );  
    cvNamedWindow( "多边形" );  
    cvShowImage( "多边形", img );  
  
    if ( cvWaitKey( 0 ) == 's' )  
    {  
        ;  
    }  
  
    cvReleaseImage( &img );  
    cvDestroyWindow( "Line" );  
    cvDestroyWindow( "Ellipse" );  
    cvDestroyWindow( "多边形" );  
}  
  
//字体设显示示例   
void FontSample()  
{  
    printf( "Font Sample\n" );  
    IplImage *img = cvCreateImage( cvSize( 500 , 500 ) , 16 , 1 );  
 
    cvNamedWindow( "字体"  );  
    CvFont font = { 0 };  
  
    //初始化字体为简单的字体,第三个参数为高度 ,第四个参数为宽度   
    cvInitFont( &font , CV_FONT_HERSHEY_SIMPLEX , 1.0 , 5.0   );  
    //将hello显示在图像中   
    cvPutText( img , "hello" , cvPoint( 255 , 255 ) , &font , cvScalar( 255 , 255 , 255 ) );  
    cvShowImage( "字体" , img );  
  
    //暂停   
    if ( cvWaitKey( 0 ) == 's' )  
    {  
        ;  
    }  
  
    cvDestroyWindow( "字体" );  
    cvReleaseImage( &img );  
}  

//文件存储示例   
void FileSample()  
{  
    //这里只是简单地使用一下OpenCV的XML的简单的一些操作,没有深入,以后会深入下去学习   
    printf( "File Storage Sample\n" );  
  
    CvFileStorage *file = cvOpenFileStorage( "1.xml" , 0 , CV_STORAGE_WRITE );  
  
    cvWriteComment( file , "This File is Made by xizero00^_^" , 0 );  
  
    //写入字符串的函数竟然不支持中文......-_-!!!!!   
    cvWriteString( file , "name" , "zhangsan" , 1 );  
    cvWriteInt( file , "age" , 23 );  
    
    cvReleaseFileStorage( &file );  
}  
  
//检测库文件版本以及是否安装IPP库   
void CheckRunDLL()  
{  
    char *libraries = NULL , *modules = NULL;  
    cvGetModuleInfo( 0 , ( const char** ) &libraries ,( const char** ) &modules  );  
    printf( "库:%s\n" , libraries  );  
    printf( "模块:%s\n" , modules );  
    system( "pause" );  
}  
  
void MouseControl()  
{  
    IplImage *img = cvCreateImage( cvSize( 450 , 450 ) , IPL_DEPTH_16U , 1 );  
    printf( "mouse control sample" );  
    cvNamedWindow( "mouse" );  
    cvShowImage( "mouse" , img );  
  
    //设置鼠标回调函数   
    cvSetMouseCallback( "mouse" , MymouseCallback ,(void *) img );  
      
    while ( 1 )  
    {  
        if ( cvWaitKey( 0 ) == 's' )  
        {  
            break;  
        }  
    }  
  
    //销毁所有打开的窗体   
    cvDestroyAllWindows();  
    cvReleaseImage( &img );  
}  
//画短线   
void Drawpoint( IplImage *img , CvPoint pt1 , CvPoint pt2 )  
{  
    cvDrawLine( img , pt1 , pt2 , cvScalar( 255 , 128 , 0 )  , 1  , 8 , 0 );  
}  
  
//鼠标回调函数   
void MymouseCallback(int event, int x, int y, int flags, void* param)  
{  
    IplImage *img = ( IplImage * )param;  
    CvPoint pt1 = { 0 } , pt2 = { 0 };  
    //获取鼠标位置,然后画短线段模拟笔迹   
    pt1.x = x;  
    pt1.y = y;  
    pt2.x = x + 1;  
    pt2.y = y + 1;  
    switch( event )  
    {  
    case CV_EVENT_LBUTTONDOWN:  
        break;  
    case CV_EVENT_MOUSEMOVE:  
        {  
            //画短线段   
            Drawpoint( img , pt1 , pt2 );  
            //刷新窗体   
            cvShowImage( "mouse" , img );  
            break;  
        }  
    }  
}  
  
void SmoothSample()  
{  
    printf( "Smoot Sample" );  
  
    IplImage *imgSrc = NULL;  
    char filename[FILENAME_MAX] = { 0 };  
  
    printf( "Please Input the Filename:" );  
    scanf_s( "%s" , filename , FILENAME_MAX );  
  
    imgSrc = cvLoadImage( filename );  
  
    cvNamedWindow( "原图" );  
    cvShowImage( "原图", imgSrc );  

    printf( "简单模糊\n" );  
  
    IplImage *imgSimple = cvCreateImage( cvGetSize( imgSrc ) , imgSrc->depth , imgSrc->nChannels );  
    cvSmooth( imgSrc , imgSimple , CV_BLUR , 4 , 4  );//简单模糊的两个参数4 ,4 是对4*4的领域求和,然后做缩放   
  
    cvNamedWindow( "简单模糊" );  
    cvShowImage( "简单模糊" ,imgSimple );  
 
    printf( "中值滤波\n" );  
    IplImage *imgMedian = cvCreateImage( cvGetSize( imgSrc ) , imgSrc->depth , imgSrc->nChannels );  
    cvSmooth( imgSrc , imgMedian , CV_MEDIAN  );//中值滤波的是对默认参数(Opencv第四个参数默认为3)所以为对3*3的领域为大小进行中值滤波   
    cvNamedWindow( "中值滤波" );  
    cvShowImage( "中值滤波" , imgMedian );  
  
    printf( "高斯滤波\n" );  
      
    IplImage *imgGaussian = cvCreateImage( cvGetSize( imgSrc ) , imgSrc->depth , imgSrc->nChannels );  
    cvSmooth( imgSrc , imgGaussian , CV_GAUSSIAN  );//高斯滤波:对图像进行核默认大小为0的高斯卷积进行滤波   
    cvNamedWindow( "高斯模糊" );  
    cvShowImage( "高斯模糊" , imgGaussian );  
  
    printf( "双边滤波\n" );  
    IplImage *imgBiLateral = cvCreateImage( cvGetSize( imgSrc ) , imgSrc->depth , imgSrc->nChannels );   
    cvSmooth( imgSrc , imgBiLateral , CV_BILATERAL , 3 , 3 , 11 , 11  );//注意双边滤波的参数 3  3  11 11  ,颜色sigma 为3, 空间sigma为3后面的11没有用处,不能省略   
    cvNamedWindow( "双边滤波" );  
    cvShowImage( "双边滤波" , imgBiLateral );  
 
    while( 1 )  
    {  
        if ( cvWaitKey( 0 ) == 's' )  
        {  
            break;  
        }  
          
    }  
    cvReleaseImage( &imgSimple );  
    cvReleaseImage( &imgSrc );  
    cvDestroyAllWindows();  
}  
  评论这张
 
阅读(1693)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018