opencv关于cvcanny函数 [7]
1 #include <highgui.h>
2 #include <cv.h>
3
4 IplImage * doCanny(IplImage * in,double lowThresh,double highThresh,double aperture)
5 {
6 if(in->nChannels !=1)
7 {
8 return 0;
9 }
10 IplImage *out =cvCreateImage(cvSize(cvGetSize(in).width,cvGetSize(in).height),IPL_DEPTH_8U,1);
11 cvCanny(in,out,lowThresh,highThresh,aperture);
12 return (out);
13
14 }
15 int main()
16 {
17 cvNamedWindow("example-in");
18 cvNamedWindow("example-out");
19 IplImage * in=cvLoadImage("I:\\资料\\opencv相关资料\\OpenCV教程\\图像与视频\\airplane.png",0);
20 cvShowImage("example-in",in);
21 IplImage * out = doCanny(in,1.0,3.0,3.0);
22 cvShowImage("example-out",out);
23
24 cvWaitKey(0);//key point
25 cvReleaseImage(&in);
26 cvReleaseImage(&out);
27 cvDestroyWindow("example-in");
28 cvDestroyWindow("example-out");
29
30 }
1. cvCanny:
doCanny(in,1.0,3.0,3.0);
void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 );
image 输入图像,这个必须是单通道的,即灰度图
edges 输出的边缘图像 ,也是单通道的,但是是黑白的
threshold1 第一个阈值
threshold2 第二个阈值
aperture_size Sobel 算子内核大小
函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
2. 补充一点,灰度图的生成:
cvCanny函数需要输入图像为灰度图,怎样产生一张灰度图呢?我们可以使用cvLoadImage()载入灰度图。具体参数设置如下说明:
cvLoadImage函数使用方法:
cvLoadImage( filename, -1 ); //默认读取图像的原通道数
cvLoadImage( filename, 0 ); //强制转化读取图像为灰度图
cvLoadImage( filename, 1 ); //读取彩色图
3. 关于cvCanny函数的一个错误记录:
出现OpenCV Error:Assertion failed (src.derth()==dst.depth && src.size()==dst.size()) 错误,导致程序中断!
原因如下:
错误含义是:原数据和目的数据的深度或者大小不同 导致不能进行赋值变换。
1.check这两个图或者矩阵是不是初始化了
2.如果初始化了,初始化的大小是不是一样,即两者有没有相同的长宽
3.两者的depth深度是不是一样,即是不是一个是三通道的,一个是单通道的。或者一个是单通道32位浮点类型,一个是单通道8位整形类型。
posted on 2013-02-27 18:29 0fengfan0 阅读(4151) 评论(0) 编辑 收藏 举报