c++视觉检测-----Canny边缘算子

news2024/11/18 1:41:54

Canny边缘算子

cv::Canny()是OpenCV库中用于执行Canny边缘检测的函数。Canny边缘检测是一种广泛使用的图像处理技术,用于检测图像中的边缘。

以下是cv::Canny()函数的一般用法和参数:

void cv::Canny(
    cv::InputArray image,       // 输入图像,通常是灰度图像
    cv::OutputArray edges,      // 输出的边缘图像
    double threshold1,          // 低阈值
    double threshold2,          // 高阈值
    int apertureSize = 3,       // Sobel算子的大小,通常为3
    bool L2gradient = false    // 是否使用L2范数
);
  • image: 输入图像,通常是灰度图像。
  • edges: 输出的边缘图像,边缘像素将被标记为白色,非边缘像素将被标记为黑色。
  • threshold1threshold2: 低阈值和高阈值。这两个阈值用于控制边缘检测的灵敏度。通常,threshold1设置为较低的值,而threshold2设置为较高的值。如果图像梯度幅值高于threshold2,则被认为是强边缘。如果图像梯度幅值介于threshold1threshold2之间,且与强边缘相连,则被认为是弱边缘。
  • apertureSize: Sobel算子的大小,通常为3,表示使用3x3的Sobel核进行梯度计算。
  • L2gradient: 是否使用L2范数计算图像梯度,默认为false。如果设置为true,则使用更精确但计算量更大的L2范数,否则使用默认的L1范数。

cv::Canny()函数通过计算图像的梯度,并根据阈值将像素分为强边缘和弱边缘,最终生成边缘图像。你可以根据具体应用的需求调整阈值和其他参数以获得最佳的边缘检测效果。
以下是一个简单的C++示例,演示如何使用OpenCV的Canny函数来进行边缘检测:

#include <opencv2/opencv.hpp>

int main() {
    // 读取输入图像
    cv::Mat inputImage = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);

    if (inputImage.empty()) {
        std::cerr << "Error: Could not read the input image." << std::endl;
        return -1;
    }

    // 创建输出图像
    cv::Mat edgeImage;

    // 设置Canny边缘检测的参数
    double lowThreshold = 50;  // 低阈值
    double highThreshold = 150; // 高阈值
    int apertureSize = 3;       // Sobel算子的孔径大小
    bool L2gradient = false;    // 是否使用L2范数

    // 应用Canny边缘检测
    cv::Canny(inputImage, edgeImage, lowThreshold, highThreshold, apertureSize, L2gradient);

    // 显示原始图像和边缘图像
    cv::imshow("Original Image", inputImage);
    cv::imshow("Canny Edge Detection", edgeImage);

    cv::waitKey(0);

    return 0;
}

在这里插入图片描述

使用相机实时canny 算子边缘检测

#include <opencv2/opencv.hpp>

cv::Mat inputImage;
cv::Mat edges;

int lowThreshold = 50;
int maxLowThreshold = 200;

void updateCanny(int, void*) {
    cv::Canny(inputImage, edges, lowThreshold, lowThreshold * 3, 3);
    cv::imshow("Canny Edges", edges);
}

int main() {
    cv::VideoCapture cap(0); // 打开本地相机(通常为0)

    if (!cap.isOpened()) {
        std::cerr << "Error: Could not open the camera." << std::endl;
        return -1;
    }

    cv::namedWindow("Canny Edges", cv::WINDOW_NORMAL);

    cv::createTrackbar("Low Threshold", "Canny Edges", &lowThreshold, maxLowThreshold, updateCanny);

    while (true) {
        cap >> inputImage;
        if (inputImage.empty()) {
            break;
        }

        updateCanny(0, 0);

        char key = cv::waitKey(10);
        if (key == 27) { // 按下ESC键退出循环
            break;
        }
    }

    cap.release();
    cv::destroyAllWindows();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

005 OA人事管理系统

人事管理系统 一、系统介绍 本系统为职工人事管理系统&#xff0c;系统分为七大模块&#xff1a;职工管理&#xff0c;部门管理&#xff0c;岗位管理&#xff0c;招聘管理&#xff0c;奖惩管理&#xff0c;薪资管理&#xff0c;培训管理 系统默认有两个个角色&#xff1a;管…

css实现一行N个元素动态布局(以4个为例)

昨日同事问了我一个前端问题&#xff0c;前端开发的尺寸都不按照UI图上面还原的吗&#xff1f; 我了解了其中原由&#xff0c;告知UI图并不会考虑到所有的场景&#xff0c;只能给个案例&#xff0c;画图是死的&#xff0c;代码写出来的得是活的。就像他遇到的案例&#xff0c;请…

【高级语言程序设计】python函数式编程(一)

基础知识 Python函数式编程的主要内容包括以下几个方面&#xff1a; (1)函数作为一等公民&#xff1a;在函数式编程中&#xff0c;函数被视为一等公民&#xff0c;可以像其他数据类型一样被传递、赋值以及作为返回值。 (2)不可变数据&#xff1a;函数式编程鼓励使用不可变数据…

函数栈帧的创建与销毁剖析

目录 一、前言 二、基础知识介绍 2.1 寄存器介绍 2.2、汇编指令介绍 三、函数栈帧的创建销毁过程 3.1 调用main函数的函数 3.2 main函数开辟栈帧 3.3 在main函数中创建变量 3.4 调用Add函数前的准备 3.5 为Add函数开辟栈帧 3.6 在Add函数中创建变量并运算 3.7 Add函…

给手机上液冷?谈谈华为Mate 60系列手机专属黑科技—— “微泵液冷”手机壳

最近&#xff0c;有一个手机配件吸引了我的注意——华为的微泵液冷壳。 简单来说&#xff0c;就是在手机壳里装了无线充电微泵&#xff0c;为手机实现外置水冷的能力。让手机壳在“外观装饰”和“防摔保护”的功能性上额外加了一个“降温提性能”的作用。 接下来&#xff0c;本…

ATFX汇市:9月非农再超预期,高利率并未导致美国宏观经济收缩

ATFX汇市&#xff1a;据美国劳工部数据&#xff0c;9月季调后非农就业人口33.6万人&#xff0c;远高于前值18.7万人&#xff0c;高于预期值17万人&#xff0c;创出今年一月份以来的新高。亮眼的就业数据意味着美国宏观经济仍处于急速扩张状态&#xff0c;高利率的破坏性远低于此…

【c#】adapter.fill(dt)报错specified cast is not valid

报错信息&#xff1a; 报错specified cast is not valid,指定转换类型无效。 原因 查出来的数据有小数&#xff0c;且小数位数较多&#xff0c;问题就出现在这里&#xff0c;ORacle可以查出精确度高的数据&#xff0c;但是C#没办法查出来&#xff0c;就导致了有数据类型转换&…

区块链的两个核心概念之一签名, 另一个是共识.

Alice的公私钥&#xff0c; 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花&#xff0c;即重复宣称所有权&#xff0c; 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…

【mmdetection代码解读 3.x版本】以Fcos+FasterRcnn为例

文章目录 前言RPN部分的代码1. loss函数&#xff08;two_stage.py&#xff09;1.1 loss_and_predict函数&#xff08;base_dense_head.py&#xff09;1.1.1 loss_by_feat函数&#xff08;fcos_head.py&#xff09;1.1.1.1 get_targets函数 1.1.2 predict_by_feat函数&#xff0…

fatal: Not a git repository (or any parent up to mount point /home)解决方法

Git遇到一个问题&#xff1a; fatal: Not a git repository (or any parent up to mount point /home) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). 解决办法&#xff1a;git init 错误信息指出不是一个git仓库&#xff0c;或者它的父级目录…

【网络安全】如何保护IP地址?

使用防火墙是保护IP地址的一个重要手段。防火墙可以监控和过滤网络流量&#xff0c;并阻止未经授权的访问。一家网络安全公司的研究显示&#xff0c;超过80%的企业已经部署了防火墙来保护他们的网络和IP地址。 除了防火墙&#xff0c;定期更新操作系统和应用程序也是保护IP地址…

JavaScript(CSS)动画引擎汇总

汇总记录前端实现动画相关的库 1、animejs animejs是一个轻量级的JavaScript动画库&#xff0c;具有简单但功能强大的API。 它适用于CSS属性&#xff0c;SVG&#xff0c;DOM属性和JavaScript对象。 官网anime.js • JavaScript animation engine anime.js - a Collection by…

怎么把amr格式转换成mp3?

怎么把amr格式转换成mp3&#xff1f;AMR格式是一种被广泛应用于语音通信的音频格式。在手机通话录音、语音留言和通信等场景中&#xff0c;AMR格式常被用来存储和传输语音数据。此外&#xff0c;AMR格式也常见于专用的录音设备和录音应用程序中&#xff0c;这些设备和应用通常用…

linux下利用find 命令查找某一个目录的路径

例子 在/data/目录下查找以nginx起头命名的目录 find /data/ -name nginx* -type d 其中 /data/ 代表本例中的查找范围 -name参数指定要查找的目录名称 *代表后面通配 -type 代表查找的类型 d 代表directory目录之意

高效节能双冷源空调架构在某新建数据中心项目中的应用

随着互联网、通信、金融等行业的发展&#xff0c;数据中心产业迈入高质量发展新阶段&#xff0c;在国家“双碳”战略目标和“东数西算”工程的有力指引下&#xff0c;数据中心加快向创新技术、强大算力、超高能效为特征的方向演进。数据中心已经成为支撑经济社会数字化转型必不…

用SegNext训练dms数据集(一)

数据集官方格式&#xff1a; 在mmseg/datasets下对数据集进行初始定义 在configs/_ _base_ _/datasets下对数据加载进行定义 在configs/下选择需要的模型参数进行修改 找了两个模型fcn和danet进行训练 类别数应该等于 n 1, 也就是多少类别背景。46类应该是47 返回tools/trai…

[GXYCTF 2019]Ping Ping Ping题目解析

本题考察的内容是rce绕过&#xff0c;本事过滤的东西不算多也算是比较好绕过 基础看到这种先ping一下试试看 输入127.0.0.1看看有啥东西 有回显说明可以接着往下做 借用RCE漏洞详解及绕过总结(全面)-CSDN博客这个大佬整理的rce绕过 ;A;B无论真假&#xff0c;A与B都执行&…

How to transition ION to DMA-BUF heaps

目录 DMA-BUF ION Call flow DMA-BUF heaps Differences between ION and DMA-BUF heaps Why replace ION with DMA-BUF heaps Reference 相关代码 DMA-BUF heaps To Replace ION How to in Kernel Space How to in User Space Ueventd sepolicy Transition Exam…

JavaScript入门——(5)函数

1、为什么需要函数 函数&#xff1a;function&#xff0c;是被设计为执行特定任务的代码块 说明&#xff1a;函数可以把具有相同或相似逻辑的代码“包裹”起来&#xff0c;通过函数调用执行这些被“包裹”的代码逻辑&#xff0c;有利于精简代码方便复用。 比如之前使用的ale…

华为数通方向HCIP-DataCom H12-831题库(多选题:201-220)

第201题 DHCP Snooping是一种DHCP安全特性,这项技术可以防御以下哪些攻击? A、DHCP Server仿冒者攻击 B、针对DHCP客户端的畸形报文泛洪攻击 C、仿冒DHCP报文攻击 D、DHCP Server的拒绝服务攻击 答案:ABD 解析: 第202题 两台PE之间通过MP-BGP传播VPNv4路由,以下哪些场景…