【opencv】示例-morphology2.cpp 形态学操作:膨胀、腐蚀、开运算、闭运算

45e2d13bc45bff29776375e83145cdaf.png

b1831debea4e3a664ef0258099d12d9d.png

element_shape = MORPH_ELLIPSE;

6e387d5e35257b4456731a90ae76e3d3.png

element_shape = MORPH_RECT

2220835fa2cac410ff19ddbc2cdc9636.png

element_shape = MORPH_CROSS;

7dd9c872190d6543468c63be98e972ce.gif

aedd2f977cce9519a0cb04a70395f6d2.gif

// 包含必要的OpenCV头文件
#include "opencv2/imgproc.hpp" // 图像处理
#include "opencv2/imgcodecs.hpp" // 图像编码解码
#include "opencv2/highgui.hpp" // 高层GUI
#include <stdlib.h> // 标准库函数
#include <stdio.h> // 标准输入输出
#include <string> // 字符串操作// 使用标准的OpenCV命名空间
using namespace cv;// 功能帮助信息的静态函数
static void help(char** argv)
{// 打印帮助信息printf("\nShow off image morphology: erosion, dialation, open and close\n""Call:\n   %s [image]\n""This program also shows use of rect, ellipse and cross kernels\n\n", argv[0]);printf( "Hot keys: \n""\tESC - quit the program\n""\tr - use rectangle structuring element\n""\te - use elliptic structuring element\n""\tc - use cross-shaped structuring element\n""\tSPACE - loop through all the options\n" );
}// 声明原图像和结果图像的矩阵
Mat src, dst;// 默认形状为矩形
int element_shape = MORPH_RECT;// 进行形态学操作的最大迭代数
int max_iters = 10;
// 开运算和闭运算的位置参数
int open_close_pos = 0;
// 腐蚀和膨胀的位置参数
int erode_dilate_pos = 0;// 用于开运算/闭运算的轨迹条的回调函数
static void OpenClose(int, void*)
{int n = open_close_pos;int an = abs(n);// 创建结构元素Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );if( n < 0 )// 执行开运算morphologyEx(src, dst, MORPH_OPEN, element);else// 执行闭运算morphologyEx(src, dst, MORPH_CLOSE, element);// 显示结果imshow("Open/Close",dst);
}// 用于腐蚀/膨胀的轨迹条的回调函数
static void ErodeDilate(int, void*)
{int n = erode_dilate_pos;int an = abs(n);// 创建结构元素Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );if( n < 0 )// 执行腐蚀erode(src, dst, element);else// 执行膨胀dilate(src, dst, element);// 显示结果imshow("Erode/Dilate",dst);
}// 主函数
int main( int argc, char** argv )
{// 解析命令行参数cv::CommandLineParser parser(argc, argv, "{help h||}{ @image | baboon.jpg | }");if (parser.has("help")){// 如果有帮助命令,显示帮助help(argv);return 0;}// 获取文件名std::string filename = samples::findFile(parser.get<std::string>("@image"));// 读取图片if( (src = imread(filename,IMREAD_COLOR)).empty() ){// 图片为空则显示帮助help(argv);return -1;}// 创建窗口显示输出图像namedWindow("Open/Close",1);namedWindow("Erode/Dilate",1);// 设置轨迹条位置open_close_pos = erode_dilate_pos = max_iters;createTrackbar("iterations", "Open/Close",&open_close_pos,max_iters*2+1,OpenClose);setTrackbarMin("iterations", "Open/Close", -max_iters);setTrackbarMax("iterations", "Open/Close", max_iters);setTrackbarPos("iterations", "Open/Close", 0);createTrackbar("iterations", "Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);setTrackbarMin("iterations", "Erode/Dilate", -max_iters);setTrackbarMax("iterations", "Erode/Dilate", max_iters);setTrackbarPos("iterations", "Erode/Dilate", 0);// 主循环for(;;){// 根据轨迹条位置执行开闭运算和腐蚀膨胀OpenClose(open_close_pos, 0);ErodeDilate(erode_dilate_pos, 0);// 按键响应char c = (char)waitKey(0);if( c == 27 ) // ESC键退出break;// 更换结构元素的形状if( c == 'e' )element_shape = MORPH_ELLIPSE;else if( c == 'r' )element_shape = MORPH_RECT;else if( c == 'c' )element_shape = MORPH_CROSS;else if( c == ' ' )element_shape = (element_shape + 1) % 3;}return 0;
}
Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );

135c073b9acca5d1ec786d1dd496700a.png

morphologyEx(src, dst, MORPH_OPEN, element);

83da2ecaf9a4fc6290b9bcabd29c0a7a.png

morphologyEx(src, dst, MORPH_CLOSE, element);

47e390c63e9baf4d833e0a0b02661685.png

erode(src, dst, element);

fa4a6901efd4d593f24b772984c30ca0.png

dilate(src, dst, element);

7a31b73712eb64a85c4f3cae88bbf3df.png

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

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

相关文章

Zynq学习笔记--AXI 总线概述

目录 1. AXI总线概述 1.1 主要特点 1.2 通道功能 1.3 信号概览 2. AXI Interconnect 2.1 信号说明 2.2 内部结构 3. PS-PL AXI Interface 3.1 AXI FPD/LFP/ACP 3.2 Address Editor 3.3 地址空间 3.4 AXI-DDR 4. 通过ILA观察AXI信号 4.1 AXI 读通道 1. AXI总线概述…

Linux高级IO——多路转接之poll

本章代码Gitee地址&#xff1a;PollServer 文章目录 1. poll2. poll_server 1. poll poll的作用和select一模一样&#xff0c;只负责等待 poll在select的基础之上解决了select的两个硬伤&#xff1a; select等待的fd有上限select输入输出参数较多 #include <poll.h> …

【软件设计师知识点】八、数据库技术基础

文章目录 数据库基本术语关系型数据库基本术语数据库模型三级模式二级映射数据的独立性数据模型常用数据模型E-R 图(概念设计)数据库操作完整性规则关系代数运算集合运算符关系运算符数据库语言 SQL数据定义语言(DDL)

uniapp开发小程序手写板、签名、签字

可以使用这个插件进行操作 手写板-签名签字-lime-signature - DCloud 插件市场 但是目前这个插件没有vue3 setup Composition API的写法。所以对于此文档提供的可以直接使用,需要使用Composition API方式实现的,可以继续看。 因为Composition API方式,更加的简单、灵活,…

Java编程题目 | 四个数的三三组合

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 使用数字1、2、3、4&#xff0c;编写一个Java程序&#xff0c;找出所有互不相同且每个三位数中不含有重复数字的组合&#xff0c;并输出这些组合。 解题思路 使…

记录一个腾讯云上kafka不能正常启动问题

问题描述&#xff1a;刚在新的腾讯云三台节点上安了Zookeeper和kafka&#xff0c;改好对应配置文件后&#xff0c;启动zk和kafka。 启动zk后&#xff0c;启动kafka jpsall以后 发现两个进程都启了&#xff08;这里有猫腻&#xff0c;kafka其实没起来&#xff0c;过几秒就自动掉…

在Windows中用命令行编译C项目

在Windows中可以用命令行编译C项目 官方指导文档&#xff1a; 演练&#xff1a;在命令行上编译 C 程序 | Microsoft Learn 在官方文档中可以看到&#xff0c;可以只安装VS的命令行工具集&#xff0c;如下图所示

2.0 Hadoop 运行环境

2.0 Hadoop 运行环境 分类 Hadoop 教程 由于 Hadoop 是为集群设计的软件&#xff0c;所以我们在学习它的使用时难免会遇到在多台计算机上配置 Hadoop 的情况&#xff0c;这对于学习者来说会制造诸多障碍&#xff0c;主要有两个&#xff1a; 昂贵的计算机集群。多计算机构成的…

JVM性能调优——GC日志分析

文章目录 1、概述2、生成GC日志3、Parallel垃圾收集器日志解析3.1、Minor GC3.2、FULL GC 4、G1垃圾收集器日志解析4.1、Minor GC4.2、并发收集4.3、混合收集4.4、Full GC 5、CMS垃圾收集器日志解析5.1、Minor GC5.2、Major GC5.3、浮动垃圾 6、日志解析工具6.1、GCeasy6.2、GC…

SpringBoot项目 jar包方式打包部署

SpringBoot项目 jar包方式打包部署 传统的Web应用进行打包部署&#xff0c;通常会打成war包形式&#xff0c;然后将War包部署到Tomcat等服务器中。 在Spring Boot项目在开发完成后&#xff0c;确实既支持打包成JAR文件也支持打包成WAR文件。然而&#xff0c;官方通常推荐将Sp…

【Godot4.2】CanvasItem绘图函数全解析 - 8.绘制点索引

概述 在示意图绘制过程中或者测试过程中&#xff0c;可能需要标记点的索引。 最常见的形式就是用一个圆圈作为背景&#xff0c;用阿拉伯数字作为索引。 实现的重点是动态计算背景圆的半径。原理是&#xff0c;获取字符串的矩形&#xff0c;取对角线长度的一半作为外接圆的半…

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天&#xff0c;从学术研究者到产业投资者&#xff0c;无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”&#xff0c;指的是一项新技术的各个要素&#xff0c;以新的方式互相影响、彼此加强&#xff0c;组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…

【运维笔记】深入理解反向代理的原理及应用

一、引言 在现代网络架构中&#xff0c;反向代理是一个核心组件&#xff0c;它在提升网站性能、增加安全性和简化网络流量管理方面发挥着至关重要的作用。本文将深入探讨反向代理的原理&#xff0c;展示其在不同场景下的应用&#xff0c;并通过具体案例来说明如何实现和优化反…

【opencv】示例-phase_corr.cpp 捕获视频流并通过计算相位相关性来检测画面中的移动...

// 包含OpenCV库的头文件 #include "opencv2/core.hpp" // 包含OpenCV核心功能 #include "opencv2/videoio.hpp" // 包含视频IO功能 #include "opencv2/highgui.hpp" // 包含高级GUI功能&#xff0c;显示图像 #include "opencv2/imgproc.hp…

机器视觉系列之【硬件知识】-工业相机(三)

目录 几个高频面试题目 如何解决工业相机的丢帧现象 工业相机是怎么实现触发的?

SpringCloud 2021.0.9 OpenFeign 与 circuitbreaker-resilience4j 使用示例

背景 OpenFeign是微服务中服务远程调用组件。 circuitbreaker 是断路器的抽象接口。 resilience4j是断路器的一种实现。 在服务间远程调用过程中&#xff0c;为了避免服务雪崩&#xff0c;需要设置失败保护机制&#xff0c;当下游服务超时或者不可用时&#xff0c;上游服务可…

Eureka-搭建Eureka步骤

简介&#xff1a; Eureka是Netflix开发的服务发现框架&#xff0c;本身是一个基于REST的服务&#xff0c;主要用于定位运行在AWS域中的中间层服务&#xff0c;以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中&#xff0c;以实…

【OTA】STM32新能源汽车OTA技术ymodem协议PC串口升级过程

【OTA】STM32新能源汽车OTA技术ymodem协议PC串口升级过程 文章目录 前言一、实验工具1.串口USB线——烧录APP2生成的BIN文件2.STLINK——烧录BOOT代码和APP1代码3.烧录工具——将BIN文件烧录到单片机中4.FLYMCU——清除芯片FLASH 二、硬件绘制1.原理图2.PCB 三、软件配置1.BOOT…

Github 2024-04-13 开源项目日报 Top9

根据Github Trendings的统计,今日(2024-04-13统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目2C++项目2Jupyter Notebook项目2TypeScript项目1Cuda项目1非开发语言项目1GoogleTest - Google测试和模拟框架 创建周期:3181 天开发…

订单状态及其转换

目录 新建状态&#xff08;Created&#xff09;/待处理&#xff08;Pending&#xff09; 待支付&#xff08;Pending Payment&#xff09; 支付确认中&#xff08;Payment Processing&#xff09; 支付成功&#xff08;Paid&#xff09; 处理中&#xff08;Processing&…