由于有些输出的图像与输入图像相比,大小深度和通道数目都不一样,所以不能使用输出图像覆盖输入图像的方法。有几个封装好的函数在这方面很有用,它们包含了为输出图像分配内存的工作,也同时包含了图像处理等变换。
首先对原RGB图像进行灰度处理。
然后利用cvPyrDown()创建一幅高度宽带均为输入图像一半尺寸的图像。
最后利用Canny边缘检测输出一个单通道(灰度级)图像。
环境:WIN7 32bits+VS2010+OpenCV2.2.0
代码如下:
- #include "stdafx.h"
- #include "cv.h"
- #include <cxcore.h>
- #include <highgui.h>
- //第一个函数:缩放处理函数
- IplImage*doPyrDown(IplImage*in,int filter=IPL_GAUSSIAN_5x5){
- assert(in->width%2==0 && in->height%2==0);//确认长宽像素是偶数(否则无法缩放一半)
- IplImage* out=cvCreateImage(
- cvSize(in->width/2,in->height/2),
- in->depth,
- in->nChannels
- );//创建新图像,长宽各一半,同深度,同通道数
- cvPyrDown(in,out);
- return(out);
- };
- //第二个函数:Canny边缘检测
- IplImage* doCanny(IplImage* in,double lowThresh,double highThresh,double aperture){
- if(in->nChannels!=1)
- return(0);//Canny只能处理灰度图
- IplImage* out = cvCreateImage(
- cvGetSize( in ),
- in->depth, //IPL_DEPTH_8U,
- 1);
- cvCanny( in, out, lowThresh, highThresh, aperture );
- //函数的第二及第三个参数为两个阈值。小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
- return( out );
- };
- int main( int argc, char** argv ){
- cvNamedWindow("Example RGB", CV_WINDOW_AUTOSIZE );
- cvNamedWindow("Example Gray", CV_WINDOW_AUTOSIZE );
- cvNamedWindow("Example Pyr", CV_WINDOW_AUTOSIZE );
- cvNamedWindow("Example Canny", CV_WINDOW_AUTOSIZE );
- IplImage* img_rgb = cvLoadImage("cube.jpg");//载入原RBG图
- IplImage* out;
- cvShowImage("Example RGB",img_rgb );//显示原RBG图
- out = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1);
- cvCvtColor(img_rgb, out ,CV_BGR2GRAY);//把载入图像转换为灰度图
- cvShowImage("Example Gray", out );//显示灰度图
- out = doPyrDown( out );
- out = doPyrDown( out );//执行两次缩小处理
- cvShowImage("Example Pyr", out );//显示缩小图
- out = doCanny( out, 10, 100, 3 );//进行Canny边缘检测
- cvShowImage("Example Canny", out );//显示canny边缘检测图
- cvWaitKey(0);
- cvReleaseImage( &out);//通过每个独立独立阶段处理图像,简化了流程
- cvDestroyWindow("Example Gray");
- cvDestroyWindow("Example Pyr");
- cvDestroyWindow("Example Canny");
- }
好了。运行,得到效果图:
阅读(10988) | 评论(0) | 转发(1) |