【VisionMaster】卡尺工具

本文详细介绍了卡尺工具的功能,包括边缘点检测和边缘对宽度测量。工具通过仿射变换、投影滤波及边缘提取来寻找边缘。在参数配置中,边缘阈值、最大结果数、边缘极性和计分函数(如对比度、边缘位置、相对位置和灰度均值)起关键作用。计分函数采用分段函数形式,根据边缘特性进行评分。在边缘对模式下,增加了归一位置、相对位置等多种评分方式。然而,在试用版中切换到边缘对模式时出现了运行错误。
摘要由CSDN通过智能技术生成

1. 功能概述

卡尺工具主要有两种功能,一是检测边缘点的位置,二是检测边缘对之间的宽度。

2. 基本原理

  • 指定需要查找边缘的矩形ROI区域
  • 利用矩形ROI的四个顶点与对应的转正后矩形(搜索方向与水平轴平行)的四个顶点构建仿射变换关系,并利用该放射变换矩形ROI区域内的图像转正
    在这里插入图片描述
  • 沿着投影方向转正后的矩形ROI区域内的图像投影成单像素高度的水平像素带(一般是取每个位置处所有垂直方向像素的平均值)
  • 对像素带执行滤波操作
  • 执行边缘提取
  • 根据指定的边缘筛选方式对边缘进行筛选

3. 方案配置

在这里插入图片描述

4. 单边缘

在这里插入图片描述

4.1 边缘阈值参数

  • 边缘阈值较小时,能够查找到边缘
    在这里插入图片描述
  • 边缘阈值过大时,无法查找到边缘
    在这里插入图片描述

4.2 最大结果数参数

在这里插入图片描述
在这里插入图片描述

4.3 边缘极性参数

用于控制边缘的方向,共有一下三种方式可供选择:

  • 由黑到白 提取由黑到白过度的边缘
    在这里插入图片描述
  • 由白到黑 提取由白到黑过度的边缘
    在这里插入图片描述
  • 任意极性 同时提取由黑到白由白到黑两种边缘
    在这里插入图片描述

4.4 计分函数

根据指定的计分方式对边缘进行评分,提供了对比度边缘位置相对位置灰度均值四种方式。每个评分使能下,均包括曲线类型起点中点终点计分高值以及计分低值等六个参数。曲线类型包括递增递减两种类型。通过设置这六个参数使目标边缘点集合的分值最高。

计分函数实际上是分段函数

4.4.1 计分函数(分段函数)表现形式

  • 形式一
    在这里插入图片描述
  • 形式二
    在这里插入图片描述
  • 形式三
    在这里插入图片描述
  • 形式四
    在这里插入图片描述

4.4.2 计分方式

  • 对比度
    默认开启的计分方式。以边缘处的对比度作为计分函数的自变量,根据对比度计分函数计算出边缘的评分,最后选择出得分最高的边缘。由于使用的图像都是8Bit深度的灰度图像,因此,自变量的取值范围[0, 255]
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 边缘位置
    边缘位置相对于查找区域中心的绝对距离作为计分函数的自变量。因此,自变量的取值范围[0, search_length * 0.5]
    在这里插入图片描述
    由上图可知,自变量的范围是[0, 91.1819]
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相对位置
    边缘位置相对于查找区域中心的相对距离作为计分函数的自变量。因此,自变量的取值范围[search_length * 0.5, search_length * 0.5]
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 灰度均值
    按区域投影灰度均值评分,使用评率较低。

5. 边缘对

边缘对方式一次性提取两个边缘。除在单边缘中提供的计分方式外,还提供归一位置评分归一相对位置评分间距评分间距评分相对间距差评分五种计分方式。此外,边缘对模式还提供一个新的参数边缘对宽度,用以计算实际输入计分函数的自变量。

  • 对比度
    两个边缘处对比度均值作为计分函数的自变量
  • 位置
    两个边缘位置的中点作为计分函数的自变量
  • 相对位置
    两个边缘位置的中点作为计分函数的自变量
  • 灰度均值
    两个边缘位置处的灰度均值的均值
  • 归一位置
    自变量 = | 边缘对中心到搜索区域中的距离 | / 边缘对宽度
    | 边缘对中心到搜索区域中的距离 | 的取值范围[0, search_length * 0.5)
    一般情况下,设置边缘对宽度search_length * 0.5,以保证自变量的取值范围是[0, 1)
    在这里插入图片描述
  • 归一相对位置
    自变量 = 边缘对中心到搜索区域中的距离 / 边缘对宽度
    边缘对中心到搜索区域中的距离 的取值范围(-search_length * 0.5, search_length * 0.5)
    一般情况下,设置边缘对宽度search_length * 0.5,以保证自变量的取值范围是(-1, 1)
  • 间距
    边缘对实测距离 / 边缘对宽度
  • 间距差
    |边缘对实测距离-边缘对宽度| / 边缘对宽度
  • 相对间距差
    (边缘对实测距离-边缘对宽度)/ 边缘对宽度

由于试用版程序用切换到边缘对模式,运行后提示一下错误,导致无法提供相关运行结果图像
在这里插入图片描述

首先,你需要安装OpenCV库,并且熟悉OpenCV的基本操作。然后,你可以按照以下步骤实现一个仿VisionPro卡尺工具: 1. 读取图像并进行预处理,例如灰度化、高斯滤波等。 2. 设定卡尺的起点和终点,可以使用鼠标交互或者手动输入坐标。 3. 在卡尺区域内进行边缘检测,例如使用Canny算法。 4. 对卡尺区域内的边缘进行直线拟合,例如使用Hough变换。 5. 计算拟合直线的长度、角度等信息,并将其显示在图像上。 6. 可以将卡尺工具封装成一个函数或类,方便在其他程序中调用。 以下是一个简单的示例代码: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; void measureLine(Mat img, Point2f start, Point2f end) { // 预处理图像 Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); GaussianBlur(gray, gray, Size(5, 5), 0); // 设定卡尺区域 LineIterator it(gray, start, end, 8); // 边缘检测 vector<Point> points; for (int i = 0; i < it.count; i++, ++it) { Point pt = it.pos(); points.push_back(pt); } Mat edge = Mat::zeros(gray.size(), CV_8UC1); polylines(edge, points, false, Scalar(255), 1, LINE_AA); // 直线拟合 vector<Vec4i> lines; HoughLinesP(edge, lines, 1, CV_PI / 180, 30, 30, 10); if (lines.size() == 0) { cout << "No line detected." << endl; return; } // 显示结果 Vec4i line = lines[0]; float length = norm(Point2f(line[0], line[1]) - Point2f(line[2], line[3])); float angle = atan2(line[3] - line[1], line[2] - line[0]) * 180 / CV_PI; line(img, Point(line[0], line[1]), Point(line[2], line[3]), Scalar(0, 0, 255), 2, LINE_AA); putText(img, format("Length: %.2f px", length), Point(10, 30), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2); putText(img, format("Angle: %.2f deg", angle), Point(10, 60), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(0, 0, 255), 2); imshow("Result", img); waitKey(0); } int main() { Mat img = imread("test.jpg"); Point2f start(100, 100), end(400, 400); measureLine(img, start, end); return 0; } ``` 在以上示例代码中,我们通过调用 `measureLine` 函数来实现卡尺测量。首先,我们对输入图像进行预处理,然后根据起点和终点设定卡尺区域,对卡尺区域内的边缘进行检测,接着对边缘进行直线拟合,最后计算拟合直线的长度和角度,并在图像上显示。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值