OpenCV-将图像两次缩放+转化为灰度图+边缘检测

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;
}
IplImage* doPyrDown(IplImage* in,int filter=IPL_GAUSSIAN_5x5)
{
    assert(in->width%2==0 && in->height%2==0);
    //创建首地址并分配存储空间IplImage* cvCreateImage( CvSize size, int depth, int channels );
    //size 图像宽、高
    //depth 图像元素的位深度,IPL_DEPTH_8U - 无符号8位整型
    //channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4
    //得到二维的数组的尺寸,以CvSize返回.
    //CvSize,OpenCV的基本数据类型之一。表示矩阵框大小,以像素为精度。与CvPoint结构类似
    IplImage* out=cvCreateImage(cvSize(in->width/2,in->height/2),in->depth,in->nChannels);
    //cvPyrDown使用Gaussian金字塔分解对输入图像向下采样
    //void cvPyrDown(const CvArr*src,CvArr*dst,int filter=CV_GAUSSIAN_5x5)
    //src 输入图像,dst 输出图像,其宽度和高度应是输入图像的一半,filter 卷积滤波器类型,目前仅支持CV_GAUSSIAN_5x5.
    cvPyrDown(in,out);
    return out;
}
int main(int argc, char* argv[])
{
    IplImage* img=cvLoadImage("C:\\girl.jpg");
    cvNamedWindow("Example-in");
    cvShowImage("Example-in",img);
    /*-----缩放第一次------*/
    IplImage* img1=doPyrDown(img,IPL_GAUSSIAN_5x5);
    cvNamedWindow("Example-img1");
    cvShowImage("Example-img1",img1);
    /*-----缩放第二次------*/
    IplImage* img2=doPyrDown(img1,IPL_GAUSSIAN_5x5);
    cvNamedWindow("Example-img2");
    cvShowImage("Example-img2",img2);
    /*-----变为灰度图------*/
    IplImage* outgray=cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,1); 
    cvCvtColor( img2, 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);
    cvReleaseImage(&img1);
    cvReleaseImage(&img2);
    cvDestroyWindow("Example-in");
    cvDestroyWindow("Example-outgray");
    cvDestroyWindow("Example-out");
    cvDestroyWindow("Example-img1");
    cvDestroyWindow("Example-img2");
    return 0;
}
运行结果:





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值