基于opencv的canny检测
#include "cv.h"
#include "highgui.h"
IplImage* doCanny(
IplImage* in,
double lowThresh,
double highThresh,
double aperture)
{
if (in->nChannels != 1)
return(0); //只能处理灰度图像
IplImage* out = cvCreateImage(
cvGetSize( in ),
in->depth, //8位
1);//建一个8位灰度图像
cvCanny( in, out, lowThresh, highThresh, aperture );//函数的第二及第三个参数为两个阈值。
//小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
return( out );
};
int main( int argc, char** argv )
{
IplImage* img_rgb = cvLoadImage( "D:\\vs2008\\project\\canny检测\\lena.jpg" );
IplImage* img_gry = cvCreateImage( cvSize( img_rgb->width,img_rgb->height ), img_rgb->depth, 1);
cvCvtColor(img_rgb, img_gry ,CV_BGR2GRAY);//RGB转化为灰度图像
cvNamedWindow("RGB图像", CV_WINDOW_AUTOSIZE );
cvNamedWindow("Gray图像", CV_WINDOW_AUTOSIZE );
cvNamedWindow("Canny检测图像", CV_WINDOW_AUTOSIZE );
cvShowImage("Gray图像", img_gry );
cvShowImage("RGB图像", img_rgb );
IplImage* img_cny = doCanny( img_gry, 10, 100, 3 );//设置第一阈值和第二阈值,以及soble算子参数
cvShowImage("Canny检测图像", img_cny );
cvWaitKey(0);
cvReleaseImage( &img_rgb);
cvReleaseImage( &img_gry);
cvReleaseImage( &img_cny);
cvDestroyWindow("RGB图像");
cvDestroyWindow("Gray图像");
cvDestroyWindow("Canny检测图像");
}
原图
灰度图
canny边缘检测