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

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

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> using namespace cv; //全局变量的定义
Mat src, gray, dst; //Canny边缘检测相关变量
Mat canny;
int CannyLowThreshold = ; //滑动条位置参数 //Sobel边缘检测相关变量
Mat SobelGradient_X, SobelGradient_Y;
Mat SobelAbsGradient_X, SobelAbsGradient_Y;
int SobelKernelSize = ; //滑动条位置参数 //Scharr滤波器相关变量
Mat ScharrGradient_X, ScharrGradient_Y;
Mat ScharrAbsGradient_X, ScharrAbsGradient_Y; //全局函数的声明
static void on_canny(int,void*); //canny边缘检测窗口滑动条回调函数
static void on_sobel(int,void*);//sobel边缘检测窗口滑动条回调函数
void Scharr(); int main(int argc,char **argv)
{
system("color 2F"); src = imread("D:/meinv.jpg"); //载入原图
namedWindow("原图", CV_WINDOW_AUTOSIZE);
imshow("原图", src); dst.create(src.size(), src.type()); //创建与src同类型和大小的矩阵
cvtColor(src, gray, COLOR_BGR2GRAY);//转化为灰度图像 namedWindow("Canny边缘检测", CV_WINDOW_AUTOSIZE);
namedWindow("Sobel边缘检测", CV_WINDOW_AUTOSIZE); //创建滑动条
createTrackbar("参数值: ", "Canny边缘检测", &CannyLowThreshold, , on_canny);
createTrackbar("参数值: ", "Sobel边缘检测", &SobelKernelSize, , on_sobel); //调用滑动条函数
on_canny(, );
on_sobel(, ); //调用封装了Scharr边缘检测代码函数
Scharr(); while ((char(waitKey())!= 'q'))
{ } return ; } void on_canny(int, void*)
{
blur(gray,canny,Size(, )); //先使用3*3内核来降噪
Canny(canny, canny, CannyLowThreshold, CannyLowThreshold * , ); //Canny算子
dst = Scalar::all(); //将dst内的所有元素设置为0
src.copyTo(dst,canny); //使用canny算子输出的边缘图作为掩码,来将原图拷贝到目标图中 imshow("Canny边缘检测", dst);
imwrite("D:/learn-opencv/canny.jpg", dst); } void on_sobel(int, void*)
{
//求X方向的梯度
Sobel(src, SobelGradient_X, CV_16S, , , ( * SobelKernelSize + ), , , BORDER_DEFAULT);
convertScaleAbs(SobelGradient_X, SobelAbsGradient_X); //计算绝对值 //求Y方向的梯度
Sobel(src, SobelGradient_Y, CV_16S, , , ( * SobelKernelSize + ), , , BORDER_DEFAULT);
convertScaleAbs(SobelGradient_Y, SobelAbsGradient_Y); //合并梯度
addWeighted(SobelAbsGradient_X, 0.5, SobelAbsGradient_Y, 0.5, , dst); imshow("Sobel边缘检测", dst);
imwrite("D:/learn-opencv/sobel.jpg", dst); } void Scharr()
{
Scharr(src, ScharrGradient_X, CV_16S, , ,,, BORDER_DEFAULT);
convertScaleAbs(ScharrGradient_X, ScharrAbsGradient_X); Scharr(src, ScharrGradient_Y, CV_16S, , , , , BORDER_DEFAULT);
convertScaleAbs(ScharrGradient_Y, ScharrAbsGradient_Y); addWeighted(ScharrAbsGradient_X, 0.5, ScharrAbsGradient_Y, 0.5, , dst); imshow("Scharr滤波器", dst);
imwrite("D:/learn-opencv/scharr.jpg", dst);
}

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. 使用UserLock如何实现工作站登陆访问限制

    UserLock允许用户限制受保护账户可登陆的工作站/终端.工作站/终端限制可以通过设置或者使用特定的IP范围,计算机名/IP或组织单位实现. 对于每个工作站限制你需要指定所要限制的会话类型(默认情况 ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装

    1.前言 Android Studio 是一个Android开发环境,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工 ...

  3. android studio gradle统一管理版本

    创建config.gradle ext { android = [ compileSdkVersion : 26, buildToolsVersion : "26.0.2", mi ...

  4. layui文档阅读进度

    2017年1月9日22:13:28已看完layer弹出层部分 2017年1月9日19:15:55http://www.layui.com/doc/modules/layer.html#layer.lo ...

  5. 第四章 T-SQL编程

    1.前言->此T-SQL编程是基于sql server开发环境->关键字:T-SQL编程:游标:视图和索引 2.T-SQL编程基础->标识符:常规标识符必须以汉字.字母.下划线_.@ ...

  6. 【CCPC-Wannafly Winter Camp Day3 (Div1) I】石头剪刀布(按秩合并并查集)

    点此看题面 大致题意: 有\(n\)个人,第\(i\)个人坐在编号为\(i\)的座位上,每个人等概率有石头.剪刀.布中的一张卡片.有两种操作:第一种是第\(y\)个人挑战第\(x\)个人,如果胜利则\ ...

  7. Buffer的使用

    虽然知道了怎么实例化Buffer,但这还远远不够,因为Buffer类使随nodejs一起发布的核心库,Buffer不仅能处理tcp连接中发送接收的数据,也能处理图像或者是压缩文件,甚至说文件系统里面的 ...

  8. IDEA的常用操作(快捷键)

    IDEA的常用操作(快捷键) Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt ...

  9. 初始化mysql数据库时提示字符编码错误的解决办法

    有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...

  10. 将命令的输出生成一个Web页面

    解决方法: ConvertTo-Html 命令: 生成一个HTML表格来代表命令的输出,为你提供的每个对象创建一行,在每行中,Powershell会创建代表对象属性的值. 实现效果: