C++如何用OpenCV中实现图像的边缘检测和轮廓提取?
最近有个项目需要做细孔定位和孔距测量,需要做边缘检测和轮廓提取,先看初步效果图:

主要实现代码:
int MainWindow::Test()
{// 2.9 单个像素长度um 5倍double dbUnit = 2.9/(1000*5);// 定义显示窗口namedWindow("src", WINDOW_NORMAL|WINDOW_KEEPRATIO);namedWindow("threshold", WINDOW_NORMAL|WINDOW_KEEPRATIO);namedWindow("morphologyEx x1", WINDOW_NORMAL|WINDOW_KEEPRATIO);namedWindow("morphologyEx x2", WINDOW_NORMAL|WINDOW_KEEPRATIO);namedWindow("canny", WINDOW_NORMAL|WINDOW_KEEPRATIO);namedWindow("dst", WINDOW_NORMAL|WINDOW_KEEPRATIO);resizeWindow("src", 1080,720);resizeWindow("threshold", 1080,720);resizeWindow("morphologyEx x1", 1080,720);resizeWindow("morphologyEx x2", 1080,720);resizeWindow("canny", 1080,720);resizeWindow("dst", 1080,720);//【1】载入图像Mat src = imread("0.28um+5x.jpg"); Mat src_clone = src.clone();if(src.empty()){qDebug()<<"图片为空";return 1;}imshow("src",src);//【2】转灰度图Mat gray;cvtColor(src,gray,COLOR_BGR2GRAY);//imshow("gray",gray);//【3】图像二值化threshold(gray,gray,130,190,THRESH_BINARY);imshow("threshold",gray);//【4】执行形态学开操作去除噪点Mat kernel = getStructuringElement(MORPH_RECT,Size(15,15),Point(-1,-1));morphologyEx(gray,gray,MORPH_CLOSE,kernel,Point(-1,-1),1);imshow("morphologyEx x1",gray);//【4】执行形态学开操作去除噪点Mat kernel1 = getStructuringElement(MORPH_RECT,Size(10,10),Point(-1,-1));morphologyEx(gray,gray,MORPH_CLOSE,kernel1,Point(-1,-1),1);imshow("morphologyEx x2",gray);//【5】边缘检测Canny(gray,gray,0,255);imshow("canny",gray);//【6】轮廓发现vector<vector<Point>> contours;vector<Vec4i> her;findContours(gray,contours,her,RETR_TREE,CHAIN_APPROX_SIMPLE);Mat srcImg = src;//拟合椭圆:fitEllipse()vector<RotatedRect> box(contours.size());Point2f rect[4];for (int i = 0; i<contours.size(); i++){Rect rect = boundingRect(contours[i]);Point2f pRadius;if(contours[i].size()>105){box[i] = fitEllipse(Mat(contours[i]));//条件过滤if( box[i].size.aspectRatio()<0.8||box[i].size.area()>10000000||rect.width<300 )continue;float majorAxis = std::max(box[i].size.width, box[i].size.height);rectangle(srcImg,rect,Scalar(0, 0, 255));ellipse(srcImg, box[i], Scalar(255, 0, 0), 1, 8);float x = rect.width/2.0;float y = rect.height/2.0;//【8】找出圆心并绘制pRadius=Point2f(rect.x+x,rect.y+y);cv::String det_info = cv::format("[%d] %.1f,%.1f(%dx%d),%.5f mm, %.5f mm",i,pRadius.x, pRadius.y, rect.width, rect.height,dbUnit*rect.width, dbUnit*majorAxis);cv::Point bbox_points;bbox_points = cv::Point(rect.x, rect.y);bbox_points = cv::Point(rect.x + det_info.size() * 11, rect.y);bbox_points = cv::Point(rect.x + det_info.size() * 11, rect.y - 15);bbox_points = cv::Point(rect.x, rect.y - 15);cv::putText(srcImg, det_info, bbox_points, cv::FONT_HERSHEY_DUPLEX, 0.4, cv::Scalar(255, 255, 255), 1, cv::LINE_AA);circle(srcImg,pRadius,1,Scalar(0,0,255),1);pRadius=box[i].center;circle(srcImg,pRadius,1,Scalar(255,0,0),1);}}// 绘制结果imshow("dst", srcImg);// 保存结果imwrite("dst.png", srcImg);
}
相关文章:
C++如何用OpenCV中实现图像的边缘检测和轮廓提取?
最近有个项目需要做细孔定位和孔距测量,需要做边缘检测和轮廓提取,先看初步效果图: 主要实现代码: int MainWindow::Test() {// 2.9 单个像素长度um 5倍double dbUnit 2.9/(1000*5);// 定义显示窗口namedWindow("src"…...
智慧水务和物联网智能水表在农村供水工程中的应用
摘 要:随着社会的进步和各项事业的飞速发展,人民生活水平的逐步提升,国家对农村饮水安全有了更高的要求,为了进一步提升农村供水服务的质量,利用现代化、信息化科学技术提升农村供水服务质量,提高用水管理效…...
机器学习笔记 - 了解 GitHub Copilot 如何通过提供自动完成式建议来帮助您编码
一、GitHub Copilot介绍 GitHub Copilot 是世界上第一个大规模 AI 开发人员工具,可以帮助您以更少的工作更快地编写代码。GitHub Copilot 从注释和代码中提取上下文,以立即建议单独的行和整个函数。 研究发现 GitHub Copilot 可以帮助开发人员更快地编码、专注于解决更大的问…...
《数据同步-NIFI系列》Nifi配置DBCPConnectionPool连接SQL Server数据库
Nifi配置DBCPConnectionPool连接SQL Server数据库 一、新增DBCPConnectionPool 在配置中新增DBCPConnectionPool,然后配置数据库相关信息 二、配置DBCPConnectionPool 2.1 DBCPConnectionPool介绍 主要介绍以下五个必填参数 Database Connection URL࿱…...
HarmonyOS/OpenHarmony元服务开发-卡片使用自定义绘制能力
ArkTS卡片开放了自定义绘制的能力,在卡片上可以通过Canvas组件创建一块画布,然后通过CanvasRenderingContext2D对象在画布上进行自定义图形的绘制,如下示例代码实现了在画布的中心绘制了一个笑脸。 Entry Component struct Card { private c…...
SpringBoot引入MyBatisGenerator
1.引入插件 <plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><configuration><!--generator配置文件所在位置--><configuratio…...
JVM面试题--实践
目录 JVM 调优的参数可以在哪里设置参数值 war包部署在tomcat中设置 jar包部署在启动参数设置 JVM 调优的参数都有哪些? 设置堆空间大小 虚拟机栈的设置 年轻代中Eden区和两个Survivor区的大小比例 年轻代晋升老年代阈值 设置垃圾回收收集器 JVM 调优的工…...
神经网络的搭建与各层分析
为什么去西藏的人都会感觉很治愈 拉萨的老中医是这么说的 缺氧脑子短路,很多事想不起来,就会感觉很幸福 一、卷积层 解释:卷积层通过卷积操作对输入数据进行处理。它使用一组可学习的滤波器(也称为卷积核或特征检测器)…...
SQL-每日一题【1174. 即时食物配送 II】
题目 配送表: Delivery 如果顾客期望的配送日期和下单日期相同,则该订单称为 「即时订单」,否则称为「计划订单」。 「首次订单」是顾客最早创建的订单。我们保证一个顾客只会有一个「首次订单」。 写一条 SQL 查询语句获取即时订单在所有用户的首次订…...
MySQL学习记录:第一章 DQL语言
文章目录 第一章 查询语言,DQL语言一、基础查询1、查询表中单个字段2、查询表中多个字段3、查询表中所有字段4、查询常量值5、查询表达式6、查询函数7、起别名8、去重9、+号的作用二、条件查询1、按条件表达式筛选2、按逻辑表达式筛选三、模糊查询四、排序查询五、常见函数1、…...
redis+token+分布式锁确保接口的幂等性
目录 1.幂等性是什么? 2.如何实现幂等性呢? 1.新增管理员,出弹窗的同时,请求后台。 2.后端根据雪花算法生成唯一标识key,以雪花数为key存到redis。并返回key给前端。 3.前端保存后端传过来的key。 4.前端输入完成…...
Vue模版语法
目录 接下来学习click 例题:修改背景颜色 例题:反复点击button按钮,可以不断切换背景颜色 先看以下例题是回顾vue的用法 <body><div id"box">{{myname}} - {{myage}}</div><script>var vm new Vue({el…...
新一代开源流数据湖平台Apache Paimon入门实操-上
文章目录 概述定义核心功能适用场景架构原理总体架构统一存储基本概念文件布局 部署环境准备环境部署 实战Catalog文件系统Hive Catalog 创建表创建Catalog管理表查询创建表(CTAS)创建外部表创建临时表 修改表修改表修改列修改水印 概述 定义 Apache Pa…...
ELK 企业级日志分析系统(一)
目录 一、ELK 简介 1.1 组件说明 1.2 为什么要使用ELK 1.3 完整日志系统的基本特征 1.4 ELK工作原理 二、Elasticsearch的介绍 2.1 Elasticsearch的核心: 三、Logstash 3.1 Logstash简介 四、Kibana 五、部署ELK日志分析系统 5.1 服务器配置 5.2 ELK Elasticse…...
2023-08-01力扣今日二题-Hard-DPLIS优先队列-好题
链接: 354. 俄罗斯套娃信封问题 题意: 一个信封有长宽,如果一个信封的长宽均严格大于另一个信封,那么大的这个信封可以装下小的这个信封 求最多能套娃几个信封 解: 类似普通的最长上升子序列,但是信封…...
并发 如何创建线程 多线程
进程:一个程序的执行过程 线程:一个方法就是一个线程 并发:多个线程抢夺一个资源 操作同一个对象 创建线程方法1 //创建线程方法1 继承Thread类 重写润方法 调用start开启线程 public class TestThead extends Thread{Overridepublic voi…...
亚马逊鲲鹏系统是怎么引流的?
亚马逊鲲鹏系统有三种引流方式,可设置通过亚马逊站点搜索、站外引流、直接访问产品页面进入到相关产品页面进行操作。 1、通过亚马逊站点搜索 正常的登录到我们的亚马逊主页,然后通过设置关键词及asin,最后进入你指定的产品,进行…...
第五章 Git
5-1、Git的安装 1、为什么要使用代码版本控制系统 【1】版本控制 【2】开发中存在的麻烦 2、Git和SVN的对比 【1】Git和SVN对比 (1)SVN (2)Git 3、Git下载和安装 【1】下载 【2】安装 一路下一步就好了,更换安装…...
无涯教程-Lua - 变量声明
变量的名称可以由字母,数字和下划线字符组成。它必须以字母或下划线开头,由于Lua区分大小写,因此大写和小写字母是不同的。 在Lua中,尽管无涯教程没有变量数据类型,但是根据变量的范围有三种类型。 全局变量(Global) …...
vue3学习-组件基础、深入组件
组件 基本概述 单独的 .vue文件 单文件组件(SFC)(single file component) 使用子组件 导入,无需注册,直接使用编译时,区分大小写可使用 />关闭标签 传递 props 需要再组件上声明注册 def…...
原创分享:长图分割神器,让超长网页和聊天记录轻松打印
你是不是也遇到过这种情况? 1、想把微信里一段长长的聊天记录打印出来留存,结果发现截图太长,打印出来字小得看不清,或者直接被裁掉一大半 2、看到一篇很好的网页文章,想打印成纸质版慢慢看,但网页截图是一…...
3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题
3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区…...
千问3.5-2B多场景落地:电商商品图识别、医疗报告图释义、工业缺陷初筛
千问3.5-2B多场景落地:电商商品图识别、医疗报告图释义、工业缺陷初筛 1. 开箱即用的视觉理解工具 千问3.5-2B是Qwen系列中的小型视觉语言模型,它能够理解图片内容并生成相关文本描述。这个工具特别适合需要快速处理图片信息的场景,比如电商…...
JIT热路径识别失效?手撕Python 3.14 _pyjitsymbol.c源码,定位3个未文档化的profile阈值陷阱(内附补丁POC)
第一章:JIT热路径识别失效?手撕Python 3.14 _pyjitsymbol.c源码,定位3个未文档化的profile阈值陷阱(内附补丁POC)Python 3.14 引入的 _pyjitsymbol JIT 框架在实际压测中频繁出现热路径“失焦”现象:高频率…...
服务器很卡,是CC攻击造成的吗
之前有客户反馈,服务器有一段时间使用总是会遇到卡的情况,查看并无流量攻击的情况,程序也未进行过什么修改,用户人数也没有什么变化。来咨询是什么原因导致的。导致机器卡的情况,一般有带宽不够,硬件性能不…...
Realtek RTL8821CU无线网卡驱动解决方案 - Linux系统WiFi适配完美指南
Realtek RTL8821CU无线网卡驱动解决方案 - Linux系统WiFi适配完美指南 【免费下载链接】rtl8821CU Realtek RTL8811CU/RTL8821CU USB Wi-Fi adapter driver for Linux 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8821CU 你是否在Linux系统上使用Realtek RTL8821CU…...
Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比
Nunchaku FLUX.1-dev GPU算力优化:TensorRT加速推理实测对比 如果你正在使用Nunchaku FLUX.1-dev模型生成图片,可能会发现一个问题:生成速度不够快,特别是当你想批量出图或者尝试不同参数时,等待时间有点长。 今天我…...
双项目驱动:AI教育轻创合伙人对比传统教育创业的显著优势
随着人工智能技术的飞速发展,AI教育正成为教育行业的新风口。在这一背景下,轻创合伙模式应运而生,为创业者提供了低门槛、高潜力的入局机会。本文将深入分析AI教育轻创合伙人相较于传统教育创业的核心优势,探讨其规模化路径的实现…...
Agent能实现7×24小时无人值守运营吗?——深度拆解AI Agent端到端自动化落地路径
随着大模型技术的演进,AI Agent(人工智能体)已不再局限于简单的对话交互,而是进化为能够自主规划、调用工具并执行复杂任务的数字员工。针对“Agent能实现724小时无人值守运营吗?”这一核心疑问,答案是肯定…...
Nacos服务实例权重设置详解:如何根据服务器性能动态调整流量分配
Nacos服务实例权重设置详解:如何根据服务器性能动态调整流量分配 在分布式系统架构中,服务实例的性能差异是不可避免的现实问题。新采购的服务器与运行多年的老旧设备并存,不同配置的云主机混合部署,这些场景都要求我们能够智能地…...
