图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。

Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。Canny 边缘检测的数学原理和算法实现这里就不再了,有兴趣的读者可以查阅专业书籍,本文主要介绍如何在OpenCV中对图像进行Canny 边缘检测,下面就来看看这个函数的原型。

《OpenCV入门指南》系列文章地址:http://blog.csdn.net/morewindows/article/category/1291764

一. 主要函数

1.1 cvCanny

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvCanny(

const CvArr* image,

CvArr* edges,

double threshold1,double threshold2,

int aperture_size=3

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。

第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。

为了更好的使用cvCanny()函数,下面再介绍二个实用的函数,这二个函数对后面的程序实现非常有帮助。

1.2 cvCreateTrackbar

函数功能:创建trackbar并添加到指定窗口

函数原型:

intcvCreateTrackbar(

const char* trackbar_name,

const char* window_name,

int* value,

intcount,

CvTrackbarCallback on_change

);

函数说明:

第一个参数表示该trackbar的名称。

第二个参数表示窗口名称,该trackbar将显示在这个窗口内。

第三个参数表示创建时滑块的位置。

第四个参数表示滑块位置的最大值,最小值固定为0。

第五个参数表示回调函数。当滑块位置有变化时,系统会调用该回调函数。

注:被创建的trackbar默认显示在指定窗口的顶端,可以通过函数cvGetTrackbarPos()来获取trackbar显示的位置信息,以及通过函数cvSetTrackbarPos()来重新设置trackbar的显示位置。

1.3  CvTrackbarCallback

函数功能:cvCreateTrackbar()函数所使用的回调函数

函数定义:

typedef void (CV_CDECL *CvTrackbarCallback)(int pos)

函数说明:

当trackbar位置被改变的时,系统会调用这个回调函数,并将参数pos设置为表示trackbar位置的数值。

二. 示例程序代码

下面就给出在OpenCV中使用Canny 边缘检测的程序代码:

[cpp] view plaincopy
  1. //图像的Canny边缘检测
  2. //By MoreWindows (http://blog.csdn.net/MoreWindows)
  3. #include <opencv2/opencv.hpp>
  4. using namespace std;
  5. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
  6. IplImage *g_pSrcImage, *g_pCannyImg;
  7. const char *pstrWindowsCannyTitle = "边缘检测图(http://blog.csdn.net/MoreWindows)";
  8. //cvCreateTrackbar的回调函数
  9. void on_trackbar(int threshold)
  10. {
  11. //canny边缘检测
  12. cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3);
  13. cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);
  14. }
  15. int main()
  16. {
  17. const char *pstrImageName = "001.jpg";
  18. const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";
  19. const char *pstrWindowsToolBar = "Threshold";
  20. //从文件中载入图像的灰度图CV_LOAD_IMAGE_GRAYSCALE - 灰度图
  21. g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
  22. g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1);
  23. //创建窗口
  24. cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
  25. cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE);
  26. //创建滑动条
  27. int nThresholdEdge = 1;
  28. cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 100, on_trackbar);
  29. //在指定窗口中显示图像
  30. cvShowImage(pstrWindowsSrcTitle, g_pSrcImage);
  31. on_trackbar(1);
  32. //等待按键事件
  33. cvWaitKey();
  34. cvDestroyWindow(pstrWindowsSrcTitle);
  35. cvDestroyWindow(pstrWindowsCannyTitle);
  36. cvReleaseImage(&g_pSrcImage);
  37. cvReleaseImage(&g_pCannyImg);
  38. return 0;
  39. }

运行效果如图所示:

本篇介绍了Canny边缘检测,这种方法能有效的找出图像中的所有边缘。后面将还有文章介绍在OpenCV中对图像进行轮廓检测,欢迎继续浏览。在对图像进行轮廓检测前必须要先对图像进行二值化,因此请先看《【OpenCV入门指南】第四篇图像的二值化》

【OpenCV入门指南】第三篇Canny边缘检测相关推荐

  1. 【OpenCV入门指南】第九篇 灰度直方图均衡化

    <OpenCV入门指南>系列文章地址: http://blog.csdn.net/morewindows/article/category/1291764 转载请标明出处,原文地址:htt ...

  2. 【OpenCV入门指南】第十三篇 人脸检测

    原文出处:http://blog.csdn.net/MoreWindows/article/details/8426318#t2 本篇介绍图像处理与模式识别中最热门的一个领域--人脸检测(人脸识别). ...

  3. 【OpenCV入门指南】第五篇 轮廓检测 上

    <[OpenCV入门指南]第三篇Canny边缘检测>中介绍了边缘检测,本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 在 ...

  4. 【OpenCV入门指南】第十篇 彩色直方图均衡化

    上一篇<OpenCV第十篇灰度直方图均衡化>介绍了灰度图像的直方图均衡化,实际生活中,肯定还是彩色图像用的最多,因此本篇介绍对彩色图像进行直方图均衡化.这样可以让大家直方图均衡化对图像增强 ...

  5. 【OpenCV入门指南】第五篇轮廓检测 下

    上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有 ...

  6. OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

    OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...

  7. agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...

    一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...

  8. 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

    推荐下我自己建的人工智能Python学习群:[809160367],群里有我整理的一份关于pytorch.python基础,图像处理opencv\自然语言处理.机器学习.数学基础等资源库,想学习人工智 ...

  9. 『网络安全』蜜罐到蜜网入门指南(三)蜜罐内部组成分析

    原创不易,点个赞呗!如果喜欢,关注.收藏不迷路. 前言 大家好,<『网络安全』蜜罐到蜜网入门指南>进入第三篇. 通过前面的内容,我们知道了什么是蜜罐以及蜜罐的作用和分类等.点击下方链接,可 ...

  10. 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测

    canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...

最新文章

  1. 数字化如何界定IT与OT?
  2. 零基础入门深度学习 | 第一章:感知器
  3. C 多态和java多态_C与java的多态机制与区别
  4. go语言学习--string、int、int64互相转换,字符串的截取,数组和字符串的转换
  5. python重新运行安装_无法重新安装Python?
  6. ARM处理器与架构对应关系
  7. java基数排序简单实现_基数排序简单Java实现
  8. 编程语言 - PHP
  9. hmcl手机版_hmcl启动器手机版下载-hmcl启动器安卓版下载mod附教程_易玩网
  10. iOS 清理缓存方法
  11. passenger多ruby版本共存部署
  12. 地下市场金融牌照疯狂买卖:全牌照可以卖十几个亿
  13. 驾考一点通维语版_驾考宝典维语版
  14. CSS中的overflow,
  15. 图像透视投影变换 四边形——标准矩形
  16. 应届毕业生(程序员)如何工作更顺利、步步高升
  17. 基于RabbitMq的削峰实例
  18. depot_tools官方文档+工具包下载
  19. Office系列版本安装包下载
  20. 半导体测试:基于PXI 平台的先进性能中的AC/DC和V-I测试

热门文章

  1. 深入理解Angular2变化监测和ngZone
  2. 模板---函数模板,类模板等
  3. GridView 中DataFormatString失效的原因
  4. Vue学习笔记(七)
  5. [Luogu] 树状数组
  6. [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
  7. 搭建 Hexo Blog
  8. mobiscroll 插件札记(一)
  9. Raphael的transform用法
  10. 利用common-fileupload组件实现java上传下载