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);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wedo2.0恐龙主题暑假班(搭建图纸、课程,海报,素材,视频等)

wedo2.0恐龙 前言&#xff1a; 图纸是roboriseit的&#xff0c;大家都知道roboriseit出品必属精品。 原版图纸是英文带水印的&#xff0c;所以实际上课还需要备课。 备课的时候对课程进行了调整&#xff0c;自己制作的5天的暑假班课程&#xff0c;内容比较丰富&#xff0c;…

34.利用matlab解 多变量多目标规划问题(matlab程序)

1.简述 学习目标&#xff1a;适合解 多变量多目标规划问题&#xff0c;例如 收益最大&#xff0c;风险最小 主要目标法&#xff0c;线性加权法&#xff0c;权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) &#xff1b; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…

【React】关于组件之间的通讯

&#x1f31f;组件化&#xff1a;把一个项目拆成一个一个的组件&#xff0c;为了便与开发与维护 组件之间互相独立且封闭&#xff0c;一般而言&#xff0c;每个组件只能使用自己的数据&#xff08;组件状态私有&#xff09;。 如果组件之间相互传参怎么办&#xff1f; 那么就要…

高电压功放的优点有哪些呢(高压放大器)

高电压功放是电子设备中的一种特殊类型的功率放大器&#xff0c;具有独特的优点&#xff0c;被广泛应用于各种领域。高电压功放可以将低电压信号放大到较高的电压水平&#xff0c;实现对大功率负载的驱动。下面我们来看看一下高电压功率放大器的优点。 1.宽电压范围 高电压功放…

Unity通过代码切换材质

效果展示 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class MaterialSwitcher : MonoBehaviour {public Material newMaterial; // 新材质private Material oldMaterial; // 旧材质private Renderer renderer; // 渲染器组件…

浅谈React中的ref和useRef

目录 什么是useRef&#xff1f; 使用 ref 访问 DOM 元素 Ref和useRef之间的区别 Ref和useRef的使用案例 善用工具 结论 在各种 JavaScript 库和框架中&#xff0c;React 因其开发人员友好性和支持性而得到认可。 大多数开发人员发现 React 非常舒适且可扩展&#xff0c;…

【NLP】训练chatglm2的评价指标BLEU,ROUGE

当进行一定程度的微调后&#xff0c;要评价模型输出的语句的准确性。由于衡量的对象是一个个的自然语言文本&#xff0c;所以通常会选择自然语言处理领域的相关评价指标。这些指标原先都是用来度量机器翻译结果质量的&#xff0c;并且被证明可以很好的反映待评测语句的准确性&a…

[回馈]ASP.NET Core MVC开发实战之商城系统(五)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页【商品类型&#xff0c;ba…

Vue2 第十八节 插槽

1.默认插槽 2.具名插槽 3.作用域插槽 插槽 ① 作用&#xff1a;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于父组件和子组件间通信 ② 分类&#xff1a;默认插槽&#xff0c;具名插槽&#xff0c;作用域插槽 一.默认…

【黑马头条之redis实现延迟任务】

本笔记内容为黑马头条项目的延迟任务精准发布文章部分 目录 一、实现思路 二、延迟任务服务实现 1、搭建heima-leadnews-schedule模块 2、数据库准备 3、安装redis 4、项目集成redis 5、添加任务 6、取消任务 7、消费任务 8、未来数据定时刷新 1.reids key值匹配 …

【有趣的设计模式】23 种设计模式详解和场景分析

前言 七大设计原则 1、单一原则&#xff1a;一个类只负责一个职责 2、开闭原则&#xff1a;对修改关闭&#xff0c;对扩展开放 3、里氏替换原则&#xff1a;不要破坏继承关系 4、接口隔离原则&#xff1a;暴露最小接口&#xff0c;避免接口过于臃肿 5、依赖倒置原则&#xff1…

黑客学习笔记(网络安全)

一、首先&#xff0c;什么是黑客&#xff1f; 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手&#xff0c;现阶段黑客所需要掌握的远远不止这些。 以前是完全涉及黑灰产业的反派角色&#xff0c;现在大体指精通各种网络技术的程序人员 二、为什么要学习黑客技术&#xff1f;…

怎么把图片变成表格?几个步骤轻松转换

如果您需要将一张图片中的数据转换成表格&#xff0c;这里有几个简单的步骤&#xff0c;可以帮助您完成这个转换过程。以下是需要注意的事项。 首先&#xff0c;我们先了解OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。然后合理运用…

真的不想知道如何进行语音翻译才简单吗

郑希&#xff1a;嘿&#xff0c;王浩&#xff01;我听说你最近去了日本旅游&#xff0c;怎么样&#xff1f;体验如何&#xff1f; 王浩&#xff1a;哈哈&#xff0c;太棒了&#xff01;日本真是一个充满魅力的国家。不过&#xff0c;要说令我惊喜的还是语音翻译技术&#xff0…

论文阅读 - Social bot detection in the age of ChatGPT: Challenges and opportunities

论文链接&#xff1a;https://www.researchgate.net/publication/371661341_Social_bot_detection_in_the_age_of_ChatGPT_Challenges_and_opportunities 目录 摘要&#xff1a; 引言 1.1. Background on social bots and their role in society 1.2. The rise of AI-gene…

深度学习各层负责什么内容?

1、深度学习——神经网络简介 深度学习(Deep Learning)(也称为深度结构学习【Deep Structured Learning】、层次学习【Hierarchical Learning】或者是深度机器学习【Deep Machine Learning】)是一类算法集合&#xff0c;是机器学习的一个分支。 深度学习方法近年来&#xff0c…

微信小程序使用 canvas 2d 实现签字板组件

本文是在微信小程序中使用 canvas 2d 来实现签字板功能&#xff1b; 效果图&#xff1a; 代码&#xff1a; 1、wxml <view><canvas id"canvas"type"2d"bindtouchstart"start"bindtouchmove"move"bindtouchend"end&qu…

一文带你了解TCP/IP模型以及封装和分用

文章目录 1. 网络协议2. OSI七层网络模型3.TCP/IP (五层/四层)4. 封装和分用 1. 网络协议 网络协议是计算机网络中用于规定数据在网络中传输和处理的规则&#xff0c;它定义了在网络中通信的格式、规范和顺序。网络协议可以分为不同的层次&#xff0c;每个层次负责不同的功能和…

linux大神Brendan Gregg 性能之巅 第二版(systems performance)阅读心得(第一章)

笔者从事某副省级市政务云系统运维7年&#xff0c;最近被下面这张图吸引开始阅读Brendan Gregg的《性能之巅 第二版》&#xff0c;下面将结合自己的运维经验一起来看看这本700多页的书。 1、绪论 1.1 系统性能 系统性能的影响因素涉及软件和硬件&#xff0c;CPU、内存、磁盘io…

opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

什么是图像平滑处理? 图像平滑处理&#xff08;Image Smoothing&#xff09;是一种图像处理技术&#xff0c;旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像&#xff0c;以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括…