C++ OpenCV Canny边缘检测,使用Trackbar滑动条选择最佳参数

news2024/9/20 22:09:35

目录

  • 一、代码
  • 二、检测效果

一、代码

下面代码可以通过Trackbar滑动条拖动查看最佳阈值,使用只需要修改导入图像路径。本教程提供的边缘检测方法为Canny,学者可以在此框架基础上替换为其它检测方法。

具体代码见下:

#include <iostream>               // 头文件路径
#include <opencv2/opencv.hpp>     // 图像读写
#include <opencv2/highgui.hpp>    // 图像显示
using namespace cv;               // 命名空间
using namespace std;

Mat g_src;                               // 定义g_src的矩阵变量,用于存储原始图像。
int T_value = 50;                        // 整型变量,初始化为50,该变量表示Canny边缘检测算法中的下阈值
int T_max = 255;                         // 整型变量,初始话为255,8位图像中像素的最大值

void Callcanny(int, void*) {             // 定义执行边缘检测函数
	Mat gauss, gray, edge, dst;          // 定义四个局部矩阵变量,分别用于存储高斯模糊后的图像,灰度图像,边缘图像和最终的输出图像。
	GaussianBlur(g_src, gauss, Size(3, 3), 0, 0, 4);  // 对原始图像 g_src 进行高斯模糊,结果存储在 gauss 中。这里使用了 3x3 的核,标准差为 0(由核大小自动计算),边界处理方
	// cvtColor(gauss, gray, CV_BGR2GRAY);
    cvtColor(gauss,gray,COLOR_BGR2GRAY);         // 将高斯模糊后的图像 gauss 从 BGR 颜色空间转换为灰度图像,结果存储在 gray 中。
	Canny(gray, edge, T_value / 2, T_value, 3, false);  //对灰度图像 gray 进行 Canny 边缘检测,结果存储在 edge 中。下阈值是 T_value / 2,上阈值是 T_value,Sobel 算子的孔径
	g_src.copyTo(dst, edge);        // 将原始图像 g_src 复制到 dst 中,但只有 edge 中非零像素对应的像素才会被复制。这样就将检测到的边缘叠加到了原始图像上。
	imshow("Canny", dst);           // 在名为 "Canny" 的窗口中显示处理后的图像 dst
} 

void myCannyTrackbar() {            // 创建滑动条函数
	namedWindow("Canny", WINDOW_AUTOSIZE);    // 创建一个名为 "Canny" 的窗口,窗口大小会自动调整。
	createTrackbar("Threshold size", "Canny", &T_value, T_max, Callcanny);    // 在 "Canny" 窗口中创建一个名为 "阈值大小" 的滑动条,滑动条的值范围是 0 到 T_max,当滑动条的
	Callcanny(0, 0);                // 初始化时调用一次 Callcanny 函数
}

int main(int argc,char** argv) {
	// const string path = "D:/VS2015/image/Visible.bmp";//将这里换成你的图片保存的路径即可
	// const string path = "Images/Visible/CAMERA20240827113325.bmp";    // 定义了图像的路径。
	const string path = "Images/Visible/calibration_Plate.png";  // 定义了图像的路径。
	g_src = imread(path);          // 读取图像,并将结果存储在 g_src 中。
	if (!g_src.data) {             // 判断图像是否加载成功。
		cout << "could not load the image" << endl;
		return -1;
	}
	double t1 = cv::getTickCount();  // 计算程序运行时间
	myCannyTrackbar();               // 调用 myCannyTrackbar 函数创建窗口和滑动条
	double t2 = cv::getTickCount();
	double t = (t2 - t1) / cv::getTickFrequency();
	cout << "time cost " << t << endl;
	waitKey(0);       // 等待按键按下
	destroyAllWindows();   // 关闭所有窗口。
	return 0;
}

二、检测效果

原图见下:

在这里插入图片描述

运行上面代码检测效果见下:

在这里插入图片描述

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

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

相关文章

重磅发布:OpenAI o1全新推理模型系列

2024年9月12日&#xff0c;OpenAI正式推出全新的推理模型系列——OpenAI o1。这款全新AI模型系列专为解决复杂问题而设计&#xff0c;能够在响应前花费更多时间进行思考&#xff0c;并通过深入推理应对比以往模型更具挑战性的科学、编程和数学问题。 1. 开发背景与首发版本 今…

【记录】C++学习路线

一、记录心得&#xff1a; 目前自己的状况是刚上大三&#xff0c;学校是双非一本&#xff0c;教的主流方向是 J A V A JAVA JAVA开发方向&#xff0c;还有就是嵌入式方向&#xff0c;这两个方向自己都不是很感兴趣&#xff0c;所以从大一开始就自学 C C C&#xff0c;加入 A…

2024.9.20 作业

写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; a.在家目录下创建目录文件&#xff0c;dir b.dir下创建dir1和dir2 c.把当前目录下的所有文件拷贝到dir1中&#xff0c; d.把当前目录下的所有脚本文件拷贝到dir2中 e.把dir2打包并压缩为dir2.tar.xz f.再把…

Cypress初次安装启动常见问题

安装成功后会出现如图所示目录和文件 Cypress启动问题 进入node_modules下的.bin 目录,执行命令: cypress open 启动cypress&#xff0c;此时会有一个报错&#xff0c;如图 需要进入项目目录&#xff0c;编辑package.json文件中scripts配置 此时再次启动CMD&#xff0c;进入根…

CSP-J2024全真模拟题 阅读程序题3+程序填空题

由于明天考试&#xff0c;今天晚上给大家提供详细的答案和解析&#xff0c;求关注点赞和评论 28.将第 1 行改为 &#xff03;include<iostream>&#xff0c;程序的运行结果不变。&#xff08;&#xff09; A.对B.错 29.本程序用到了队列而不是栈的思想。&#xff08;&a…

pdb文件查看工具pdbripper.exe

下载地址:https://www.bing.com/ck/a?!&&p249322afbfbc575bJmltdHM9MTcyMTM0NzIwMCZpZ3VpZD0yMjBkODE2MC1hYjNhLTZkYTMtMGVlYi05NWQ5YWE3OTZjOGEmaW5zaWQ9NTE4Mg&ptn3&ver2&hsh3&fclid220d8160-ab3a-6da3-0eeb-95d9aa796c8a&psqpdbripper.exe&…

交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面

一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言&#xff0c;在交通标志图像识别功能实现中&#xff0c;基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对收集到的58种常见的交通标志图像作为数据集&#xff0c;进行迭代训练最后得到一个识别精度较高…

多态的使用和原理(c++详解)

一、多态的概念 多态顾名思义就是多种形态&#xff0c;它分为编译时的多态&#xff08;静态多态&#xff09;和运行时的多态&#xff08;动态多态&#xff09;&#xff0c;编译时多态&#xff08;静态多态&#xff09;就是函数重载&#xff0c;模板等&#xff0c;通过不同的参数…

Netty源码解析-请求处理与多路复用

摘要 Netty源码系列-NioEventLoop 1.1 Netty给Channel分配Nio Event Loop的规则 看下图&#xff0c;EventLoopGroup是线程组&#xff0c;每个EventLoop是一个线程&#xff0c;那么线程处理请求是怎么分配的呢&#xff1f;我们看一下源码 1.1.1 MultithreadEventLoopGroup.…

人力资源数据集分析(二)_随机森林与逻辑回归

数据入口&#xff1a;人力资源分析数据集 - Heywhale.com 数据说明 字段说明EmpID唯一的员工IDAge年龄AgeGroup年龄组Attrition是否离职BusinessTravel出差&#xff1a;很少、频繁、不出差DailyRate日薪Department任职部门&#xff1a;研发部门、销售部门、人力资源部门Dista…

Visual Studio Code( VS Code)倍速提高编程工作效率的免费的源代码编辑器

耕耘于编程二十多年&#xff0c;后端、前端、操作系统、数据库、脚本都做过&#xff0c;各种各样的编程工具&#xff0c;IDE开发环境都用过&#xff0c;但是让我感觉比较好用、容易上手、能够提高工作效率的开发工具还是VS Code&#xff0c;下面我就简单的介绍一下这个广泛使用…

MySQL--导入SQL文件(命令行导入)

MySQL--导入SQL文件 一、前言二、导入SQL文件 一、前言 用可视化编辑工具编写&#xff0c;并且在控制台输入命令行在MySQL中导入SQL文件。 在导入SQL文件之前查看了目前存在的数据库 **目标&#xff1a;**在可视化编辑工具(这里以word文档为例&#xff09;中编写SQL语句&…

计算机毕业设计 美妆神域网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

力扣53-最大子序和(Java详细题解)

题目链接&#xff1a;力扣53-最大子序和 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个…

EM-seq:酶法甲基化测序,甲基化测序的新选择

DNA甲基化作为一种关键的表观遗传修饰&#xff0c;已被广泛认为在基因表达调控、细胞分化以及多种疾病的发生发展中扮演着重要角色。DNA甲基化&#xff1a;将甲基基团添加到DNA分子的胞嘧啶上&#xff0c;可以影响基因的活性而不改变DNA序列&#xff0c;这种改变的持久性和可逆…

【原创教程】电气电工20:一文弄透电气电工辅材

电气电工这些知识点,我们描述的比较细,虽然看起来比较简单,但是它是后面我们技能提升的基础,如果我们后面学电气工程师相关知识,这些都属于基本功。 接着我们来看一下电气辅材。 电气辅材定义: 电气辅材是指与电气设备固有的元器件配套使用的配件和器具。常见的电气辅…

基于FPGA+GPU异构平台的遥感图像切片解决方案

随着遥感和成像技术的不断进步和普及&#xff0c;获取大量高分辨率的遥感图像已成为可能。这些大规模的遥感图像数据需要进行有效的处理和分析&#xff0c;以提取有用的信息&#xff0c;进行进一步的应用。遥感图像切片技术应运而生&#xff0c;该技术可以将大型遥感图像分割成…

Sentinel组件学习

Sentinel组件学习 1. Sentinel是什么2. Sentinel的作用3. 为啥使用Sentinel4. SpringCloud整合Sentinel代码示例4.1. 搭建Sentinel Dashboard4.2. SpringCloud项目接入Sentinel4.3. 使用SentinelResource注解 5. Sentinel Dashboard使用5.1 流控规则流控模式流控效果 5.2 熔断规…

cmake--get_filename_component

作用 按照指定的方式获取文件或者目录的信息。 使用 get_filename_component(<variable> <filename> <component>) variable: 用于保存提取的信息。 filename: 指定路径的文件或者目录。 component: 链接1 component DIRECTORY: 提取文件或者目录的父…

西安国际数字影像产业园:什么让这里成为创新型数字园区的典范?

在数字化浪潮奔涌的时代&#xff0c;创新型数字园区如雨后春笋般涌现&#xff0c;而树莓集团倾力打造的西安国际数字影像产业园无疑是其中的佼佼者。究竟是什么让这里成为创新型数字产业园区的典范呢&#xff1f; 1、西安国际数字影像产业园拥有强大的产业集聚效应。树莓集团凭…