Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97314
  • 博文数量: 5
  • 博客积分: 169
  • 博客等级: 入伍新兵
  • 技术积分: 106
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-05 16:44
文章分类
文章存档

2012年(5)

我的朋友

分类: C/C++

2012-02-06 13:18:14

由于有些输出的图像与输入图像相比,大小深度和通道数目都不一样,所以不能使用输出图像覆盖输入图像的方法。有几个封装好的函数在这方面很有用,它们包含了为输出图像分配内存的工作,也同时包含了图像处理等变换。
 
首先对原RGB图像进行灰度处理。
 
然后利用cvPyrDown()创建一幅高度宽带均为输入图像一半尺寸的图像。
 
最后利用Canny边缘检测输出一个单通道(灰度级)图像。
 
环境:WIN7 32bits+VS2010+OpenCV2.2.0
 
代码如下:
  1. #include "stdafx.h"
  2. #include "cv.h"
  3. #include <cxcore.h>
  4. #include <highgui.h>



  5. //第一个函数:缩放处理函数       
  6. IplImage*doPyrDown(IplImage*in,int filter=IPL_GAUSSIAN_5x5){
  7.             assert(in->width%2==0 && in->height%2==0);//确认长宽像素是偶数(否则无法缩放一半)
  8.             IplImage* out=cvCreateImage(
  9.                 cvSize(in->width/2,in->height/2),
  10.                 in->depth,
  11.                 in->nChannels
  12.                 );//创建新图像,长宽各一半,同深度,同通道数
  13.             cvPyrDown(in,out);
  14.             return(out);
  15.         };
  16. //第二个函数:Canny边缘检测
  17. IplImage* doCanny(IplImage* in,double lowThresh,double highThresh,double aperture){
  18.     if(in->nChannels!=1)
  19.         return(0);//Canny只能处理灰度图

  20.     IplImage* out = cvCreateImage(
  21.         cvGetSize( in ),
  22.         in->depth, //IPL_DEPTH_8U,
  23.         1);
  24.     cvCanny( in, out, lowThresh, highThresh, aperture );
  25.     //函数的第二及第三个参数为两个阈值。小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
  26.     return( out );
  27. };




  28. int main( int argc, char** argv ){


  29.     cvNamedWindow("Example RGB", CV_WINDOW_AUTOSIZE );
  30.     cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE );
  31.     cvNamedWindow("Example Pyr", CV_WINDOW_AUTOSIZE );
  32.     cvNamedWindow("Example Canny", CV_WINDOW_AUTOSIZE );

  33.     IplImage* img_rgb = cvLoadImage("cube.jpg");//载入原RBG图
  34.     IplImage* out;

  35.     cvShowImage("Example RGB",img_rgb );//显示原RBG图

  36.     out = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1);
  37.     cvCvtColor(img_rgb, out ,CV_BGR2GRAY);//把载入图像转换为灰度图
  38.     cvShowImage("Example Gray", out );//显示灰度图

  39.     out = doPyrDown( out );
  40.     out = doPyrDown( out );//执行两次缩小处理
  41.     cvShowImage("Example Pyr", out );//显示缩小图

  42.     out = doCanny( out, 10, 100, 3 );//进行Canny边缘检测
  43.     cvShowImage("Example Canny", out );//显示canny边缘检测图

  44. cvWaitKey(0);
  45. cvReleaseImage( &out);//通过每个独立独立阶段处理图像,简化了流程

  46. cvDestroyWindow("Example Gray");
  47. cvDestroyWindow("Example Pyr");
  48. cvDestroyWindow("Example Canny");
  49. }

好了。运行,得到效果图:

阅读(10988) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~