Opencv几个经典的入门级程序

灰度化处理图像
主要用到
plImage* cvCreateImage( CvSize size, int depth, int channels )
相当于如下的步骤:
header = cvCreateImageHeader(size,depth,channels);
cvCreateData(header);

具体的代码如下:

#include "cv.h"
#include "highgui.h"

int main( int argc, char** argv )
{
      IplImage* pImg; //声明图像结构体
     if( argc == 3 &&(pImg = cvLoadImage( argv[1], 0)) != 0 )
      {

      IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);//强制转换为Gray
      cvCopy(pImg, pImg2, NULL);//指针重定向
      cvSaveImage(argv[2], pImg2);//存入图像
      cvNamedWindow( "Image", 1 );//命名显示窗口
      cvShowImage( "Image", pImg );//显示图像
      cvWaitKey(0); //程序暂停,等待用户触发一个按键动作      
      cvDestroyWindow( "Image" );//销毁窗口      
      cvReleaseImage( &pImg ); //释放图片占有的内存      
      return 0;
    }
  return -1;
}       


编译:

g++ -ggdb `pkg-config opencv --cflags --libs` gray.c -o gray
执行 :
./gray  ../picture/lena.jpg    gray.jpg


原图:

效果图:


边缘检测:

使用到的函数为:

void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture size=3 );

各参数的含义如下:

image  单通道输入图像.

edgee  单通道存储边缘的输出图像

threshold1  第一个阈值

threshold2  第二个阈值

aperture_size  Sobel 算子内核大小 

函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。cvCanny只接受单通道图像作为输入,故载入图像时,cvLoadImage(SRC,iscolor),第二个参数必须设为0.


#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main( int argc, char** argv )
{
  //初始化图像指针  
  IplImage* pImg = NULL;
  IplImage* pCannyImg = NULL;

  if( argc == 2 &&(pImg =cvLoadImage(argv[1], 0)) != 0 )//选择单通道输入
    {           
        pCannyImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
      //对图像进行边缘检测      
       cvCanny(pImg, pCannyImg, 50, 150, 3);

      //命名窗口      
      cvNamedWindow("src", 1);
      cvNamedWindow("canny",1);
      //显示
      cvShowImage( "src", pImg );
      cvShowImage( "canny", pCannyImg );
      cvWaitKey(0); 

      cvDestroyWindow( "src" );
      cvDestroyWindow( "canny" );

      cvReleaseImage( &pImg );
      cvReleaseImage( &pCannyImg );

      return 0;
    }
  return -1;
}                                         

编译:

g++ -ggdb `pkg-config opencv --cflags --libs` canny.c -o canny
执行 :
./canny ../../../../../Pictures/wolf.jpg 
    
效果图:


轮廓检测

函数模型如下:

int cvFindContours( CvArr* image, CvMemStorage* storage,CvSeq** first contour, int header size=sizeof(CvContour),int mode=CV RETR LIST, int method=CV CHAIN APPROX SIMPLE,CvPoint offset=cvPoint(0,0) );
测试代码如下:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main( int argc, char** argv )
{
  //初始化指针
  IplImage* pImg = NULL;
  IplImage* pContourImg = NULL;


  CvMemStorage * storage = cvCreateMemStorage(0);
  CvSeq * contour = 0;
  int mode = CV_RETR_EXTERNAL;

  if( argc == 3)
      if(strcmp(argv[2], "all") == 0)
        mode = CV_RETR_CCOMP; //ÄÚÍâÂÖÀª¶¼¼ì²â

     cvNamedWindow("src", 1);
     cvNamedWindow("contour",1);


  if( argc >= 2 && (pImg = cvLoadImage( argv[1], 0)) != 0 )
    {

      cvShowImage( "src", pImg );

      pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
      //copy source image and convert it to BGR image
      cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);

      cvFindContours( pImg, storage, &contour, sizeof(CvContour),mode, CV_CHAIN_APPROX_SIMPLE);

    }
  else
    {
      cvDestroyWindow( "src" );
      cvDestroyWindow( "contour" );
      cvReleaseMemStorage(&storage);

      return -1;
    }
  
  cvDrawContours(pContourImg, contour, CV_RGB(0,0,255), CV_RGB(255, 0, 0),2, 2, 8);
  cvShowImage( "contour", pContourImg );

  cvWaitKey(0);


  cvDestroyWindow( "src" );
  cvDestroyWindow( "contour" );
  cvReleaseImage( &pImg );
  cvReleaseImage( &pContourImg );

  cvReleaseMemStorage(&storage);

  return 0;
}                                                                       
编译运行后的效果如下图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值