当前位置: 首页 > news >正文

OpenCV与Qt5开发卡尺找圆工具

文章目录

  • 前言
  • 一、卡尺原理
  • 二、1D边缘提取
  • 三、圆拟合
  • 四、软件实现
  • 结束语


基于OpenCV与Qt5构建卡尺找圆工具

前言

博主近期基于海康Vision Master4.0做了一个工业视觉工程项目,其中就使用到了海康VM的找圆工具,然后博主根据其中的技术原理,也仿照开发了一个类似的功能,基于OpenCV和Qt5构建一个卡尺找圆的工具。卡尺找圆是在计算机视觉领域中常用的技术,用于检测图像中的圆形目标,广泛应用于工业自动化、机器人导航等领域。
卡尺拟合直线参考博主的利用OpenCV与Qt5构建卡尺拟合直线工具(C++实现)


一、卡尺原理

卡尺的原理就是找N个小矩形ROI里面的灰度值突变的地方。即:遍历每个小矩形ROI,分别找到1个点,这个点是灰度突变的峰值。然后把这N个点拟合成直线或者圆。

二、1D边缘提取

在这里插入图片描述

  1. 通过Qt5构建一个卡尺圆查找工具形状,由一个个矩形工具构建;
    在这里插入图片描述

  2. 对平均灰度值(轮廓)进行高斯滤波,目的是让曲线更平滑,消除噪点;
    在这里插入图片描述

  3. 对平滑后的轮廓求一阶导数;
    在这里插入图片描述

  4. 根据设置的参数提取边缘点。

三、圆拟合

圆拟合是一种用于从给定的离散点集合中拟合出一个最佳的圆形的方法。它在许多领域中都有广泛的应用,例如计算机视觉、几何建模等。

圆拟合的原理通常基于最小二乘法,旨在找到一个圆形模型,使得给定的点集与该圆形模型之间的残差平方和最小。其步骤如下:

  1. 数据预处理:首先,对于输入的离散点集合,可以进行一些必要的预处理操作,例如去除异常值或噪声点,确保数据质量。

  2. 初始圆形模型估计:为了得到初始的圆形模型,通常可以通过其中的几个点计算出初始的圆心位置和半径估计值。这可以使用一些简单的方法,如三点定圆法(经过任意三个非共线点确定一个圆)或最小二乘法拟合一个初始圆。

  3. 最小二乘拟合:在得到初始的圆形模型估计后,使用最小二乘法来优化拟合结果。最小二乘法通过迭代的方式调整圆心位置和半径的值,使得拟合误差最小化。

  4. 残差计算和优化:在每次迭代中,根据当前的圆心位置和半径,计算每个点到圆的距离,然后将这些距离的平方和作为拟合误差的度量。根据拟合误差,通过优化算法(如非线性最小二乘法或梯度下降法)更新圆心和半径的值。

  5. 收敛判断:对于每次迭代,可以设定一个收敛条件,当满足条件时停止迭代,得到最终的圆形模型。

需要注意的是,圆拟合方法的性能和效果取决于离散点集的分布和噪声程度。对于噪声较多或存在异常点的情况,可能需要使用一些鲁棒性更好的拟合方法,例如 RANSAC(随机抽样一致性)算法来估计圆形模型。

四、软件实现

未使用商业图像处理库,而是纯粹Qt5+OpenCV
在这里插入图片描述

  1. 选择要查找圆的图像
    在这里插入图片描述

  2. 绘制一个矢量圆查找工具
    在这里插入图片描述

  3. 圆查找
    在这里插入图片描述
    4.与海康Vision Master对比
    在这里插入图片描述
    在这里插入图片描述
    海康Vision Master卡尺工具计算: 圆半径是233.628,圆心(831.874,504.140)
    博主开发的卡尺找圆工具计算 圆半径是233.125,圆心(831.584,503.827)

结束语

由于博主能力有限,本篇文章中提及的方法,也难免会有疏漏之处,希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。

http://www.lryc.cn/news/505508.html

相关文章:

  • 【网络安全】Web Timing 和竞争条件攻击:揭开隐藏的攻击面
  • 分立器件---运算放大器关键参数
  • Stable Diffusion Controlnet常用控制类型解析与实战课程 4
  • Linux 本地编译安装 gcc9
  • SpringBoot 自定义事件
  • unity shader中的逐像素光源和逐顶点光源
  • MongoDB-副本集
  • 【图像处理lec7】图像恢复、去噪
  • C# 连接ClickHouse 数据库
  • 在安卓Android应用中实现二维码图像的保存与条形码文本合并
  • Vue3 重置ref或者reactive属性值
  • 深入理解STL list erase
  • 使用 Python 从 ROS Bag 中提取图像:详解与实现
  • MYSQL执行一条update语句,期间发生了什么
  • 前端性能优化思路
  • 有向图判环(leetcode207,leetcode210)
  • 概率论得学习和整理25:EXCEL 关于直方图/ 频度图 /hist图的细节,2种做hist图的方法
  • PHP8.4下webman直接使用topthink/think-orm
  • 【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string,垃圾回收( GC)
  • 基于微信小程序的小区疫情防控ssm+论文源码调试讲解
  • 第P2周:Pytorch实现CIFAR10彩色图片识别
  • CTFHub 命令注入-综合练习(学习记录)
  • OpenCV目标检测 级联分类器 C++实现
  • QT6 Socket通讯封装(TCP/UDP)
  • elasticsearch设置密码访问
  • 彻底理解如何优化接口性能
  • C# 位运算
  • 【Flink-scala】DataStream编程模型之状态编程
  • RabbitMQ的核心组件有哪些?
  • 【Linux基础】基本开发工具的使用