本次实验使用了两种方法进行了边缘检测,分别使用到了opencv中的两个API函数为Canny()和Sobel()函数。实验后加了Scharr滤波器,它其实是基于Sobel()函数的。

这三个API中的参数可进行调整,实验中也可动态调整参数值来达到不同的检测效果。

  1. #include<opencv2/highgui/highgui.hpp>
  2. #include<opencv2/imgproc/imgproc.hpp>
  3.  
  4. using namespace cv;
  5.  
  6. //全局变量的定义
  7. Mat src, gray, dst;
  8.  
  9. //Canny边缘检测相关变量
  10. Mat canny;
  11. int CannyLowThreshold = ; //滑动条位置参数
  12.  
  13. //Sobel边缘检测相关变量
  14. Mat SobelGradient_X, SobelGradient_Y;
  15. Mat SobelAbsGradient_X, SobelAbsGradient_Y;
  16. int SobelKernelSize = ; //滑动条位置参数
  17.  
  18. //Scharr滤波器相关变量
  19. Mat ScharrGradient_X, ScharrGradient_Y;
  20. Mat ScharrAbsGradient_X, ScharrAbsGradient_Y;
  21.  
  22. //全局函数的声明
  23. static void on_canny(int,void*); //canny边缘检测窗口滑动条回调函数
  24. static void on_sobel(int,void*);//sobel边缘检测窗口滑动条回调函数
  25. void Scharr();
  26.  
  27. int main(int argc,char **argv)
  28. {
  29. system("color 2F");
  30.  
  31. src = imread("D:/meinv.jpg"); //载入原图
  32. namedWindow("原图", CV_WINDOW_AUTOSIZE);
  33. imshow("原图", src);
  34.  
  35. dst.create(src.size(), src.type()); //创建与src同类型和大小的矩阵
  36. cvtColor(src, gray, COLOR_BGR2GRAY);//转化为灰度图像
  37.  
  38. namedWindow("Canny边缘检测", CV_WINDOW_AUTOSIZE);
  39. namedWindow("Sobel边缘检测", CV_WINDOW_AUTOSIZE);
  40.  
  41. //创建滑动条
  42. createTrackbar("参数值: ", "Canny边缘检测", &CannyLowThreshold, , on_canny);
  43. createTrackbar("参数值: ", "Sobel边缘检测", &SobelKernelSize, , on_sobel);
  44.  
  45. //调用滑动条函数
  46. on_canny(, );
  47. on_sobel(, );
  48.  
  49. //调用封装了Scharr边缘检测代码函数
  50. Scharr();
  51.  
  52. while ((char(waitKey())!= 'q'))
  53. { }
  54.  
  55. return ;
  56.  
  57. }
  58.  
  59. void on_canny(int, void*)
  60. {
  61. blur(gray,canny,Size(, )); //先使用3*3内核来降噪
  62. Canny(canny, canny, CannyLowThreshold, CannyLowThreshold * , ); //Canny算子
  63. dst = Scalar::all(); //将dst内的所有元素设置为0
  64. src.copyTo(dst,canny); //使用canny算子输出的边缘图作为掩码,来将原图拷贝到目标图中
  65.  
  66. imshow("Canny边缘检测", dst);
  67. imwrite("D:/learn-opencv/canny.jpg", dst);
  68.  
  69. }
  70.  
  71. void on_sobel(int, void*)
  72. {
  73. //求X方向的梯度
  74. Sobel(src, SobelGradient_X, CV_16S, , , ( * SobelKernelSize + ), , , BORDER_DEFAULT);
  75. convertScaleAbs(SobelGradient_X, SobelAbsGradient_X); //计算绝对值
  76.  
  77. //求Y方向的梯度
  78. Sobel(src, SobelGradient_Y, CV_16S, , , ( * SobelKernelSize + ), , , BORDER_DEFAULT);
  79. convertScaleAbs(SobelGradient_Y, SobelAbsGradient_Y);
  80.  
  81. //合并梯度
  82. addWeighted(SobelAbsGradient_X, 0.5, SobelAbsGradient_Y, 0.5, , dst);
  83.  
  84. imshow("Sobel边缘检测", dst);
  85. imwrite("D:/learn-opencv/sobel.jpg", dst);
  86.  
  87. }
  88.  
  89. void Scharr()
  90. {
  91. Scharr(src, ScharrGradient_X, CV_16S, , ,,, BORDER_DEFAULT);
  92. convertScaleAbs(ScharrGradient_X, ScharrAbsGradient_X);
  93.  
  94. Scharr(src, ScharrGradient_Y, CV_16S, , , , , BORDER_DEFAULT);
  95. convertScaleAbs(ScharrGradient_Y, ScharrAbsGradient_Y);
  96.  
  97. addWeighted(ScharrAbsGradient_X, 0.5, ScharrAbsGradient_Y, 0.5, , dst);
  98.  
  99. imshow("Scharr滤波器", dst);
  100. imwrite("D:/learn-opencv/scharr.jpg", dst);
  101. }

1.Canny 效果图

2.Sobel 效果图

3.Scharr滤波器

边缘检测 opencv的更多相关文章

  1. 图像边缘检测--OpenCV之cvCanny函数

    图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

  2. 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测

    1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...

  3. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  4. Opencv-Python学习笔记(二)

    2. 使用OpenCV3处理图像 2.1 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法. 三种常用色彩空间:灰度.BGR.HSV(Hue色调,Saturation饱和度, ...

  5. OpenCV3计算机视觉+python(三)

    使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 O ...

  6. OpenCV 之 边缘检测

    上一篇 <OpenCV 之 图像平滑> 中,提到的图像平滑,从信号处理的角度来看,实际上是一种“低通滤波器”. 本篇中,数字图像的边缘,因为通常都是像素值变化剧烈的区域 (“高频”),故可 ...

  7. 【OpenCV】边缘检测:Sobel、拉普拉斯算子

    推荐博文,博客.写得很好,给个赞. Reference Link : http://blog.csdn.net/xiaowei_cqu/article/details/7829481 一阶导数法:梯度 ...

  8. OpenCV图像Canny边缘检测

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

  9. OpenCV: Canny边缘检测算法原理及其VC实现详解(转载)

    原文地址:http://blog.csdn.net/likezhaobin/article/details/6892176 原文地址:http://blog.csdn.net/likezhaobin/ ...

随机推荐

  1. IDEA配置 tomcat server

  2. 从零开始的全栈工程师——JS面向对象(初篇)

    面向对象编程 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式.它使用先前建立的范例,包括模块化,多态和封装几种技术.今天,许多流行的编程语言(如Java,JavaScript,C#,C+ ...

  3. WebAPI示例

    一.新建项目 二. 代码: Models.Products实体类 public class Product { /// <summary> /// 产品编号 /// </summar ...

  4. 线程队列queue

    队列queue 队列用于线程之间安全的信息交换 队列和列表的区别:队列里的信息get()后就没了,而列表获取数据则是copy,原列表里的值还在 使用前先实例化队列 q = queue.Queue(ma ...

  5. Tomcat启动报Error listenerStart错误 | "beans" 必须匹配 DOCTYPE 根 "null" | java.lang.reflect.MalformedParameterizedTypeException

    maven打包发布工程时,发布上去却报错FAIL - Deployed application at context path /ch but context failed to start 在服务器 ...

  6. seattle language school & on-line degree

    http://www.kaplaninternational.com/ https://asuonline.asu.edu/online-degree-programs/ https://asuonl ...

  7. Python中的Numpy、SciPy、MatPlotLib安装与配置

    Python安装完Numpy,SciPy和MatplotLib后,可以成为非常犀利的科研利器.网上关于这三个库的安装都写得非常不错,但是大部分人遇到的问题并不是如何安装,而是安装好后因为配置不当,在使 ...

  8. vi使用命令

    二.移动光标类命令 h :光标左移一个字符 l :光标右移一个字符 space:光标右移一个字符 Backspace:光标左移一个字符 k或Ctrl+p:光标上移一行 j或Ctrl+n :光标下移一行 ...

  9. Vim-命令合集

    命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...

  10. [转载]Memcached缓存服务的简单安装

    1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...