OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)

本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html


本博文接下来将介绍图像变换相关的Demo,如下图所示:

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)_第1张图片


CannyDetector_Demo.cpp(Canny边缘检测)

demo源码如下:

#include "stdafx.h"    //预编译头文件    

/**
 * Canny边缘检测示例
 */

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

///全局变量

Mat src, src_gray;
Mat dst, detected_edges;

int edgeThresh = 1;
int lowThreshold;
int const max_lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;
const char* window_name = "Edge Map";

/**
 * 滑动条回调函数,根据阈值进行Canny边缘检测
 */
static void CannyThreshold(int, void*)
{
    /// 用3x3的矩形核对src图像平滑
    blur( src_gray, detected_edges, Size(3,3) );

    /// Canny边缘检测
    Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );

    dst = Scalar::all(0);

    src.copyTo( dst, detected_edges);
    imshow( window_name, dst );
}


/**
 * 主函数
 */
int main( int, char** argv )
{
  /// 加载图片
  src = imread("D:\\opencv\\lena.png");

  if( !src.data )
    { return -1; }

  /// 创建一个和源图像大小和类型一样的目标图像
  dst.create( src.size(), src.type() );

  /// 将图像转换为灰度图
  cvtColor( src, src_gray, COLOR_BGR2GRAY );

  /// 创建窗口
  namedWindow( window_name, WINDOW_AUTOSIZE );

  /// 创建用于用户输入阈值大小的滑动条
  createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );

  /// 显示图像
  CannyThreshold(0, 0);

  waitKey(0);

  return 0;
}
运行截图:

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)_第2张图片

首先介绍cvtColor;函数原型为: C++:   void  cvtColor ( InputArray  src , OutputArray  dst , int  code , int  dstCn =0  ) 该函数的功能是将图像从一种颜色空间转换到另一种颜色空间。第一个参数为源图像,第二个参数为目的图像,第三个参数code为转换代码COLOR_BGR2GRAY,即将RGB三通过彩色图像转换为灰度图(GRAY),转换公式为:


这里主要介绍Canny函数,其函数原型为:C++: void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )

第一个参数image为单通道8位图像,这就是为什么我们要将src通过cvtColor转换为灰度图。第二个参数为边缘检测的结果。其大小和类型与src相同。threshold1为第一阈值(低阈值),threshold2为第二阈值(高阈值)。


这里有必要简单介绍一个Canny边缘检测,具体的原理请读者自行参考相关文献,这里主要介绍两个阈值的作用。其中一个阈值为高阈值,一个阈值为低阈值。可以这样认为高阈值用于提取图像的强边缘,将边缘和背景区分出来。那么问题来了如果只是提取强边缘难免会造成图像边缘链接不到一起。因而,低阈值便是用来提取弱边缘,将这些弱边缘提取出来链接图像的强边缘,这样可以使得提取出的边缘图像更加平滑。

下面是(低阈值,高阈值)分别为(80,80)(40,80)(20,80)(5,80)的Canny边缘检测效果。

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)_第3张图片

Ok.需要说明的是,本博文系列主要侧重在opencv库的应用。具体各个函数接口内部的图像原理请读者自行查阅资料。

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Canny边缘检测)_第4张图片

你可能感兴趣的:(opencv,canny)