码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-05 22:46:13      阅读:577      评论:0      收藏:0      [点我收藏+]

标签:

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:运行结果如下:

技术分享

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

标签:

原文地址:http://www.cnblogs.com/lovemi93/p/5357142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!