Canny,先Scharr得梯度再Canny,三通道黑色背景展示结果(OpenCV案例源码edge.cpp)

有所更改,参数不求完备,但求实用。源码参考D:\source\opencv-3.4.9\samples\cpp\edge.cpp

#include<opencv2\opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int edgeThresh = 1;
int edgeThreshScharr = 1;

Mat image, gray, blurImage, edge1, edge2, cedge;

const string window_name1 = "Edge map : Canny default (Sobel gradient)";
const string window_name2 = "Edge map : Canny with custom gradient (Scharr)";

static void onTrackbar(int, void*) //滑动条的响应函数,格式必须这样
{
    blur(gray, blurImage, Size(3, 3)); //均值滤波
    //直接用Canny
    Canny(blurImage, edge1, edgeThresh, edgeThresh * 3); //图,结果图(二值图),低阈值,高阈值

    cedge = Scalar::all(0); //刷新黑色背景
    image.copyTo(cedge, edge1); //image与二值图edge1得到的彩色边缘图,赋值给cedge(三通道黑色矩阵)
    imshow(window_name1, cedge);
    imshow("edge", edge1);
    /// 先用Scharr得到x、y方向的梯度图(灰度图),再用Canny
    Mat dx, dy;
    Scharr(blurImage, dx, CV_16S, 1, 0); //输入图,结果图,颜色深度(16位),x方向梯度(差分阶数),y方向梯度(差分阶数)
    Scharr(blurImage, dy, CV_16S, 0, 1);
    Canny(dx, dy, edge2, edgeThreshScharr, edgeThreshScharr * 3);//x方向输入图(必须16位),y方向输入图,输出图(8位单通道二值图),低阈值,高阈值

    cedge = Scalar::all(0);
    image.copyTo(cedge, edge2);//image与二值图edge1得到的彩色边缘图,赋值给cedge(三通道黑色矩阵)
    imshow(window_name2, cedge);

    //Scharr(blurImage, dx, CV_8U, 1, 0);
    //imshow("x", dx); //x梯度方向灰度图(突出竖条)
    //Scharr(blurImage, dy, CV_8U, 0, 1);
    //imshow("y", dy); //y梯度方向灰度图(突出横条)
}

int main()
{
    image = imread("D:/lena.jpg");
    cedge.create(image.size(), image.type()); //创建与image等大同类型的模板(矩阵)
    //cedge = Scalar::all(0); //矩阵赋值为0,即黑色模板。(注意放到响应函数中执行,每次刷新背景)

    cvtColor(image, gray, COLOR_BGR2GRAY);

    // Create a window
    namedWindow(window_name1, 1); //先创建窗体,再创建滑动条
    namedWindow(window_name2, 1);

    // create a toolbar
    createTrackbar("Canny threshold default", window_name1, &edgeThresh, 100, onTrackbar); //滑动条标签,窗体,起始,终止,响应函数
    createTrackbar("Canny threshold Scharr", window_name2, &edgeThreshScharr, 400, onTrackbar);

    // Show the image
    onTrackbar(0, 0); //执行一次响应函数,格式必须这样

    waitKey(0);
    return 0;
}

原文地址:https://www.cnblogs.com/xixixing/p/12330576.html

时间: 2024-10-05 23:25:37

Canny,先Scharr得梯度再Canny,三通道黑色背景展示结果(OpenCV案例源码edge.cpp)的相关文章

Android源码浅析(三)——Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机

Android源码浅析(三)--Android AOSP 5.1.1源码的同步sync和编译make,搭建Samba服务器进行更便捷的烧录刷机 最近比较忙,而且又要维护自己的博客,视频和公众号,也就没仔细的梳理源码的入门逻辑,今天也就来讲一个源码的玩法,各位看官,一起学习学习! 看本篇博客之前,先看下我的前面两篇 Android源码浅析(一)--VMware Workstation Pro和Ubuntu Kylin 16.04 LTS安装配置 Android源码浅析(二)--Ubuntu Roo

Unity手游之路&lt;三&gt; 基于Unity+Java的聊天室源码

http://blog.csdn.net/janeky/article/details/17233199 项目介绍 这是一个简单的Unity项目,实现最基本的聊天室群聊功能.登录聊天室后,用户可以输入信息进行发言,其他人可以收到消息.玩家还可以更改昵称.项目详细描述的前后端Socket通信,编码,解析二进制流的过程. 这个项目的主要目标有几个: 1.实现Unity的前后端通信进制          2.学习Protobuf的应用 最终的效果 前端            a.网络通信NetClie

安装软件包的三种方法yum、rpm、源码安装

一.软件安装方法1.rpm安装rpm安装软件时不会自动安装依赖2.yum安装yum安装软件时会自动安装软件所需的依赖3.源码安装最难,需要编译二.rpm介绍首先将之前的系统光驱挂载,mount /dev/cdrom /mnt/执行上面命令将iso挂载到/mnt/下ls /mnt/ cd /mnt/Packages 可以看到里面很多rpm安装包例如:zenity-3.22.0-1.el7.x86_64.rpmrpm包格式,包名.版本号.发布版本号.平台rpm -ivh rpm包文件 //安装rpm

一步步搭建自己的轻量级MVCphp框架-(三)一个国产轻量级框架Amysql源码分析(2) 进程

Amysql类 按照我的理解这就是框架的初始化 上代码 class Amysql { public $AmysqlProcess; public function Amysql() { global $Config; ini_set("magic_quotes_runtime", false); ($Config['DebugPhp'] && error_reporting(E_ALL)) || error_reporting(0); // 是否报错 ($Config[

现代编译原理--第三章(抽象语法树以及源码)

这是flxe的文件,文件名称为tiger.l %{ #include <string.h> #include "util.h" #include "tokens.h" #include "errormsg.h" #include "iostream" #include "tiger.tab.h" int charPos=1; int count = 0 ; #ifdef __cplusplus

(三)lnmp环境的搭建:mysql源码安装

mysql简介:MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一. MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. MySQL所使用的 SQL 语

leaflet开源地图库源码阅读笔记(三)——浏览器&amp;移动设备判断(browser.js)(by vczero)

一.源码结构 继上一篇blog说到整个leaflet的结构,这里重新贴一张图(src -> core),直观点,如下图.这篇blog主要研读core文件夹的源码Brower.js.因为怕篇幅较大,所以Class.js,Events.js,Handler.js,Util.js后续开博.他们是整个框架的backbone(脊梁),也是最为基础的部分. 二.Browser.js:浏览器兼容的基础构建者 引LeafLet:L.Browser handles different browser and fe

解梯度下降法的三种形式BGD、SGD以及MBGD

原帖地址:https://zhuanlan.zhihu.com/p/25765735           在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. 一般线性回归函数的假设函数为: $$h_\theta=\sum_{j=0}^n\theta_jx_j$$   对应的损失函数为: $$J_{train}(\theta)=\frac1{2m}\s

OpenCV Canny 源码注释与分析

1986年,John F.Canny 完善了边缘检测理论,Canny算法以此命名. Canny 算法的步骤: 1. 使用滤波器卷积降噪 2. 使用Sobel导数计算梯度幅值和方向 3. 非极大值抑制 + 滞后阈值 在正式处理前,用高斯滤平滑波器对图像做滤波降噪的操作,避免噪声点的干扰,但在OpenCV的canny源码中,没有进行高斯滤波,需要使用者自行滤波:有些资料将非极大值抑制和滞后阈值视为两个步骤也是可行的,但是在源码中非极大值抑制 和滞后阈值是同时进行的. canny源码的位置:\open