OpenCV-将图像转化为灰度图,然后边缘检测

来源:互联网 发布:linux编写c语言 编辑:程序博客网 时间:2024/05/18 03:27

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:cvCanny代码解释如下:

/*void cvCanny(const CvArr* img,                   CvArr* edges,                   double lowThresh,                   double highThresh,                   int apertureSize=3);    边缘检测算法    img:输入图像,为灰度图。    edges:输出图像,也是灰度图,是布尔图像。    lowThresh:下限阈值    highThresh:上线阈值    apertureSize:另一个中孔,通常,这个被sobel算子用到的中孔是cvCanny()在内部使用的。Sobel算子内核大小*/


阅读全文
0 0
原创粉丝点击