本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html
本博文接下来将介绍图像变换相关的Demo,如下图所示:
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; }运行截图:
第一个参数image为单通道8位图像,这就是为什么我们要将src通过cvtColor转换为灰度图。第二个参数为边缘检测的结果。其大小和类型与src相同。threshold1为第一阈值(低阈值),threshold2为第二阈值(高阈值)。
这里有必要简单介绍一个Canny边缘检测,具体的原理请读者自行参考相关文献,这里主要介绍两个阈值的作用。其中一个阈值为高阈值,一个阈值为低阈值。可以这样认为高阈值用于提取图像的强边缘,将边缘和背景区分出来。那么问题来了如果只是提取强边缘难免会造成图像边缘链接不到一起。因而,低阈值便是用来提取弱边缘,将这些弱边缘提取出来链接图像的强边缘,这样可以使得提取出的边缘图像更加平滑。
下面是(低阈值,高阈值)分别为(80,80)(40,80)(20,80)(5,80)的Canny边缘检测效果。
Ok.需要说明的是,本博文系列主要侧重在opencv库的应用。具体各个函数接口内部的图像原理请读者自行查阅资料。