1:代码如下:
#include "stdafx.h" #include "highgui.h" #include "cv.h" #include "iostream" using namespace std; IplImage* doCanny(IplImage* in,double lowThresh,double highThresh,double aperture) { if(in->nChannels !=1) //只对应于单通道,即灰度图 { cout<<"不是灰度图"<<endl; return 0; } //创建首地址并分配存储空间IplImage* cvCreateImage( CvSize size, int depth, int channels ); //size 图像宽、高 //depth 图像元素的位深度,IPL_DEPTH_8U - 无符号8位整型 //channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4 IplImage* out=cvCreateImage(cvGetSize(in),IPL_DEPTH_8U,1); //图像的边缘检测(采用canny算法) //函数 cvCanny 采用 Canny 算法发现输入图像的边缘而且在输出图像中标识这些边缘。 //threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。 //void cvCanny( const CvArr* image,CvArr* edges,double threshold1,double threshold2, int aperture_size=3 ) //image 输入单通道图像(可以是彩色图像)对于多通道的图像可以用cvCvtColor()修改 //edges 输出的边缘图像 ,也是单通道的,但是是黑白的 //threshold1 第一个阈值 //threshold2 第二个阈值 //aperture_size Sobel 算子内核大小 cvCanny(in,out,lowThresh,highThresh,aperture); return out; } int main(int argc, char* argv[]) { IplImage* img=cvLoadImage("C:\\horse.jpg"); cvNamedWindow("Example-in"); cvShowImage("Example-in",img); IplImage* outgray=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); cvCvtColor( img, outgray, CV_BGR2GRAY );//转化为灰度图,cvCvtColor(原图, 处理后的图, 不同类型的颜色空间转换) cvNamedWindow("Example-outgray"); cvShowImage("Example-outgray",outgray); cvNamedWindow("Example-out"); cvShowImage("Example-out",doCanny(outgray,80,150,3)); cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&outgray); cvDestroyWindow("Example-in"); cvDestroyWindow("Example-outgray"); cvDestroyWindow("Example-out"); return 0; }
2:运行结果如下:
时间: 2024-10-08 08:21:22