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

OpenCV与Qt5构建卡尺找直线工具

文章目录

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


基于OpenCV与Qt5构建卡尺拟合直线工具

前言

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

一、卡尺边缘直线拟合概述

卡尺边缘直线拟合是一种常用的计算机视觉技术,用于在图像中检测和拟合出物体的直线边缘。其原理基于数学几何和统计学方法。

以下是卡尺边缘直线拟合的基本原理:

  1. 边缘检测:首先,在图像上进行边缘检测,将图像中的边缘信息提取出来。常用的边缘检测算法包括Sobel算子、Canny算子等。

  2. 卡尺滑动窗口:从图像中选择一个起始点,然后以固定的步长和方向移动一个小窗口(通常为一维),在窗口内计算边缘像素的梯度。

  3. 距离度量与拟合:对于每个窗口,通过距离度量函数(例如,最小二乘法)来衡量窗口内像素与直线之间的误差。最常见的距离度量函数是点到直线的距离。

  4. 迭代更新:迭代地调整窗口的位置,使得距离度量的误差最小化。这可以通过不断调整窗口的位置和方向来实现,直到达到收敛条件。

  5. 直线拟合:最终,当窗口移动到最佳拟合直线时,将窗口内的点拟合成一条直线模型。这可以通过拟合算法(如最小二乘法)来计算直线参数(如斜率和截距)。

通过上述步骤,卡尺边缘直线拟合可以有效地从图像中提取直线边缘信息,并拟合出相应的直线模型。这种方法在许多计算机视觉任务中都得到了广泛应用,如目标检测、线段提取、道路标线检测等。


二、卡尺原理

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

三、1D边缘提取

在这里插入图片描述

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

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

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

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

四、直线拟合原理

直线拟合是一种常见的数学方法,用于通过一组离散的数据点来估计并拟合一条直线模型。该方法可以在许多领域中应用,如统计学、机器学习和计算机视觉等。

以下是直线拟合的原理:

  1. 数据收集:首先,收集一组已知的数据点。这些数据点可以是实验观测值、样本数据或通过其他方式获取的数据。

  2. 确定拟合模型:对于直线拟合,我们假设所需拟合的模型为一条直线。直线模型可以用斜率(slope)和截距(intercept)来表示,即y = mx + b,其中m是斜率,b是截距。

  3. 损失函数选择:选择一个损失函数来度量观测点与拟合直线之间的误差。常见的损失函数是最小二乘法(Least Squares),即将每个观测点到直线的垂直距离的平方求和。

  4. 参数估计:通过最小化损失函数,找到最佳的直线参数(斜率和截距)。在最小二乘法中,可以通过公式计算得到闭合解,或者使用优化算法(如梯度下降)进行迭代优化。

  5. 模型评估:拟合直线后,可以对模型进行评估以确定其适用性和效果。常见的评估指标包括均方误差(Mean Squared Error),确定系数(Coefficient of Determination)等。

五、软件实现

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

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

  2. 绘制一个直线查找工具
    在这里插入图片描述

  3. 直线拟合
    在这里插入图片描述

4.与海康Vision Master对比
在这里插入图片描述

结束语

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


http://www.kler.cn/a/441684.html

相关文章:

  • Open3D计算点云粗糙度(方法一)【2025最新版】
  • 【经验分享】ARM Linux-RT内核实时系统性能评估工具
  • Golang Gin系列-4:Gin Framework入门教程
  • 2025年最新汽车零部件企业销售项目管理解决方案
  • 题解 CodeForces 1037D Valid BFS? 三种解法 C++
  • HTML<img>标签
  • 7.OPEN SQL
  • BIO实战、NIO编程与直接内存、零拷贝深入辨析
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-train.py
  • 20221403郑骁恒_商用密码接口实现
  • 鸿蒙-应用内悬浮窗
  • LeetCode 2475 数组中不等三元组的数目
  • 【Linux】shell脚本二
  • Node.js day-03
  • Cadence学习笔记 5 四路HDMI原理图绘制
  • ubuntu20.04复现 Leg-KILO
  • 007 搭建DNS服务器
  • 常用的es操作
  • 软件集成测试内容和作用简析
  • LabVIEW热电偶传感器虚拟仿真实验系统
  • golang 判断一个点是否在一个多边形内
  • Linux应用开发————mysql数据库表
  • MySQL专题:事务隔离机制详解
  • 人工智能增强的音频和聊天协作服务
  • Pyside6 --Qt设计师--简单了解各个控件的作用之:Buttons
  • Git 安装全教程:从入门到上手