Halcon测量专栏-平行度

news2026/4/23 16:16:08

1.前言

1.1什么是平行度

平行度指两平面或者两直线平行的程度,指一平面(边)相对于另一平面(边)平行的误差最大允许值。
平行度评价直线之间、平面之间或直线与平面之间的平行状态。其中一个直线或平面是评价基准,而直线可以是被测样品的直线部分或直线运动轨迹,平面可以是被测样品的平面部分或运动轨迹形成的平面。

1.2平行度评价方式

测量线对线平行度误差
公差要求是测量孔的轴线相对于基准孔的轴线的平行度误差。需要用心轴模拟被测要素和基准要素,将两根心轴装于基准孔和被测孔内,形成稳定接触,

1.3halcon实现方式

针对线线平行度的评价标准,所以预先定义直线1作为基准线,直线2作为被测线。对直线2上的2个端点对基准线计算距离,并求2个距离的差值,差值的数额即为平行度的误差

2.程序

2.1C#和halcon程序

#region // 计算平行度(直线1的2个端点,到直线2的距离,的差值)
public static bool parallel(HObject Image, bool FastSet,
                 HTuple ROIBeginRow1, HTuple ROIBeginCloumn1, HTuple ROIEndRow1,  HTuple ROIEndCloumn1,
                 HTuple ROIBeginRow2, HTuple ROIBeginCloumn2, HTuple ROIEndRow2,  HTuple ROIEndCloumn2,
                 out HObject lineContours1, out HTuple resultRowBegin1,
                 out HTuple resultColumnBegin1, out HTuple resultRowEnd1, out HTuple resultCloumnEnd1,
                 out HObject lineContours2, out HTuple resultRowBegin2,
                 out HTuple resultColumnBegin2, out HTuple resultRowEnd2, out HTuple resultCloumnEnd2,
                 out double Distance)
{
    Distance = -1;
    HOperatorSet.GenEmptyObj(out lineContours1);
    HOperatorSet.GenEmptyObj(out lineContours2);
    resultRowBegin1 = -1;
    resultColumnBegin1 = -1;
    resultRowEnd1 = -1;
    resultCloumnEnd1 = -1;
    resultColumnBegin2 = -1;
    resultRowBegin2 = -1;
    resultRowEnd2 = -1; 
    resultCloumnEnd2 = -1;
    try
    {
        bool line1 = false, line2 = false;
        if (FastSet)
        {
            line1 = Module.LineMeasure_(Image, ROIBeginRow1, ROIBeginCloumn1, ROIEndRow1,  ROIEndCloumn1,
                        30, 5, 2, 20, "uniform", "first", out  lineContours1, out  resultRowBegin1,
                         out  resultColumnBegin1, out  resultRowEnd1, out  resultCloumnEnd1);
            line2 = Module.LineMeasure_(Image, ROIBeginRow2, ROIBeginCloumn2, ROIEndRow2,  ROIEndCloumn2,
                        30, 5, 2, 20, "uniform", "first", out  lineContours2, out  resultRowBegin2,
                        out  resultColumnBegin2, out  resultRowEnd2,  out  resultCloumnEnd2);
            if (!line1 || !line2)
            {
                return false;
            }
            HOperatorSet.DistancePl(resultRowBegin1, resultColumnBegin1, resultRowBegin2, resultColumnBegin2,
                        resultRowEnd2, resultCloumnEnd2, out HTuple distance1);
            HOperatorSet.DistancePl(resultRowEnd1, resultCloumnEnd1, resultRowBegin2, resultColumnBegin2,
                        resultRowEnd2, resultCloumnEnd2, out HTuple distance2);
            double d1= distance1,d2= distance2;
            Distance = Math.Abs(d1 - d2);
        }
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}
#endregion
#region // 直线查找
/// <summary>
/// 直线查找
/// </summary>
/// <param name="image">输入图像</param>
/// <param name="BeginRow">输入ROI的开始横坐标</param>
/// <param name="EndRow">输入ROI的结束横坐标</param>
/// <param name="BeginColumn">输入ROI开始列坐标</param>
/// <param name="EndColumn">输入ROI的结束列坐标</param>
/// <param name="MeasureHeight">输入测量矩形高度</param>
/// <param name="MeasureWide">输入测量矩形宽度</param>
/// <param name="Sigma">输入测量矩形的高斯滤波值</param>
/// <param name="Threshold">输入最小边缘对比度</param>
/// <param name="Measure_Set">选择拟合边1(“uniform”:最接近ROI轮廓的拟合边;“positive”:由亮到暗,“negative”:由暗到亮)</param>
/// <param name="Measure_Place">选择拟合边2(“first”:所有轮廓的第一条边,“last”:所有轮廓的最后一个边,“all”:最接近ROI轮廓的拟合边)</param>
/// <param name="LineContours">结果轮廓</param>
/// <param name="ResultRowBegin">结果轮廓开始横坐标</param>
/// <param name="ResultRowEnd">结果轮廓结束横坐标</param>
/// <param name="ResultColumnBegin">结果轮廓开始列坐标</param>
/// <param name="ResultCloumnEnd">结果轮廓结束列坐标</param>
/// <returns>拟合成功返回true,拟合失败返回false</returns>
static public bool LineMeasure_(HObject image, HTuple BeginRow, HTuple BeginColumn, HTuple EndRow, 
            HTuple EndColumn, HTuple MeasureHeight, HTuple MeasureWide, HTuple Sigma, HTuple Threshold,
            HTuple Measure_Set, HTuple Measure_Place, out HObject LineContours,
            out HTuple ResultRowBegin, out HTuple ResultColumnBegin, out HTuple ResultRowEnd, 
            out HTuple ResultCloumnEnd)
{
    HOperatorSet.GenEmptyObj(out LineContours);
    ResultRowBegin = null;
    ResultColumnBegin = null;
    ResultCloumnEnd = null;
    ResultRowEnd = null;
    try
    {

        HOperatorSet.CreateMetrologyModel(out HTuple metrologyHandle);
        HOperatorSet.AddMetrologyObjectLineMeasure(metrologyHandle, BeginRow, BeginColumn, EndRow, EndColumn,
                MeasureHeight, MeasureWide, Sigma, Threshold, new HTuple(), new HTuple(), out HTuple index);

        HOperatorSet.SetMetrologyObjectParam(metrologyHandle, new HTuple("all"), (new HTuple("measure_transition")
                                 ).TupleConcat("measure_select"), (new HTuple(Measure_Set)
                                 ).TupleConcat(Measure_Place));
        //HOperatorSet.SetMetrologyObjectParam(metrologyHandle, new HTuple("all"), new HTuple("min_score"), 0.1);
        HOperatorSet.ApplyMetrologyModel(image, metrologyHandle);
        HOperatorSet.GetMetrologyObjectResultContour(out LineContours, metrologyHandle, new HTuple("all"), new HTuple("all")
                , new HTuple(1.5));
        HOperatorSet.GetMetrologyObjectResult(metrologyHandle, index, new HTuple("all"), new HTuple("result_type"),
                       new HTuple("row_begin"), out ResultRowBegin);
        HOperatorSet.GetMetrologyObjectResult(metrologyHandle, index, new HTuple("all"), new HTuple("result_type"),
                    new HTuple("row_end"), out ResultRowEnd);
        HOperatorSet.GetMetrologyObjectResult(metrologyHandle, index, new HTuple("all"), new HTuple("result_type"),
                    new HTuple("column_begin"), out ResultColumnBegin);
        HOperatorSet.GetMetrologyObjectResult(metrologyHandle, index, new HTuple("all"), new HTuple("result_type"),
                    new HTuple("column_end"), out ResultCloumnEnd);
        HOperatorSet.TupleLength(ResultRowBegin, out HTuple length);
        if (length == 0)
        {
            return false;
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }


}
#endregion

2.2程序讲解

2.2.1读取图像和绘制ROI,并拟合直线

 line1 = Module.LineMeasure_(Image, ROIBeginRow1, ROIBeginCloumn1, ROIEndRow1,  ROIEndCloumn1,
             30, 5, 2, 20, "uniform", "first", out  lineContours1, out  resultRowBegin1,
              out  resultColumnBegin1, out  resultRowEnd1, out  resultCloumnEnd1);
 line2 = Module.LineMeasure_(Image, ROIBeginRow2, ROIBeginCloumn2, ROIEndRow2,  ROIEndCloumn2,
             30, 5, 2, 20, "uniform", "first", out  lineContours2, out  resultRowBegin2,
             out  resultColumnBegin2, out  resultRowEnd2,  out  resultCloumnEnd2);

2.2.计算平行度

HOperatorSet.DistancePl(resultRowBegin1, resultColumnBegin1, resultRowBegin2, resultColumnBegin2,
            resultRowEnd2, resultCloumnEnd2, out HTuple distance1);
HOperatorSet.DistancePl(resultRowEnd1, resultCloumnEnd1, resultRowBegin2, resultColumnBegin2,
            resultRowEnd2, resultCloumnEnd2, out HTuple distance2);
double d1= distance1,d2= distance2;
Distance = Math.Abs(d1 - d2);

总结

由于2D检测中并不适配面测量,所以文中仅设定线线平行度。当计算平行度误差过大是,可能出现直线的直线度过大造成的误差。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++第二弹---C++入门(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 C入门 1、函数重载 1.1、函数重载概念 1.2、C支持函数重载的原理--名字修饰(name Mangling) 3、引用 3.1、引用概念 3.2、引用特性 3.3、常引用 …

图片和PDF 加水印去水印

图片和PDF 加水印去水印 前要1. 图片加水印1.1 方法11.2 方法2 2. 去水印3. pdf加水印4. pdf 去水印 前要 网上查了很多资料, 汇总了几个不错的代码, 顺便做个笔记 1. 图片加水印 1.1 方法1 简单方便, 后也好处理 # -*- coding:utf-8 -*- import os from PIL import Imag…

蓝桥杯练习系统(算法训练)ALGO-975 P0802字符串表达式

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个字符串表达式求解函数int expression(char* s); 输入一个字符串表达式&#xff0c;返回它的结果。表达式长度不会超过100。表…

基于springboot+vue的汽车改装方案网站(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 对于当今社会发展趋势越来越迅猛&#xff0c;传统汽车改装模式的没落,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变&#xff0c;人们的娱乐方式不仅仅再是读书看报。由于近些…

【基于HTML5的网页设计及应用】——判断是否为闰年

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Linux运维之管理工具篇

一、前言 因运维过程中&#xff0c;经常会借助于很多工具来实现我们的监控、备份、校验&#xff0c;安全测试&#xff0c;批量操作&#xff0c;可视化辅助&#xff0c;集中管理等&#xff0c;甚至AI相关&#xff0c;本文特对常用工具进行梳理记录&#xff0c;以备不时之需及后…

【Consul】注册Consul服务时报错404

【Consul】注册Consul服务时报错404 大家好 我是寸铁&#x1f44a; 总结了一篇golang注册Consul服务时报错404✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 今天寸铁想注册一个服务到Consul服务中心&#xff0c;却发现报错了&#xff0c;错误码是404&#xff0c;下面和…

精通 Python 装饰器:代码复用与功能增强技巧

精通 Python 装饰器&#xff1a;代码复用与功能增强技巧 引言装饰器基础装饰器的定义基本装饰器的实现方法理解 符号的用法简单装饰器示例代码 使用装饰器增强函数功能日志记录性能测试事务处理小结 装饰器进阶应用管理用户认证缓存机制的实现参数化装饰器的创建和应用多个装饰…

unity

Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 Unity Remote - Unity 手册 登陆账号&#xff0c;找到一个3d 免费资源 3D Animations & Models | Unity Asset Store unity 里面window->package Manager 里面可以看到自己的asset &#xff0c;下载后…

xlsx.js读取本地文件,按行转成数组数据

1.下包 //1. npm install xlsx //2. yarn add xlsx2.结构 <template><input type"file" change"onFileChange" /> </template>3.代码 <script> import * as XLSX from xlsxexport default {methods: {onFileChange (event) {/…

基于SpringBoot的“学生成绩管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“学生成绩管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面图 管理员功能界面图 学生管理界面图…

解决方案∣解密新能源产业的供应链革新之路,助力行业驶入数字化转型“快车道”

近期&#xff0c;备受关注的2024年全国两会如期举行&#xff0c;国务院总理李强作政府工作报告中多次提到锂电产业链上下游。 政府工作报告指出&#xff0c;2023年&#xff0c;国内新能源汽车产销量分别达到958.7万辆和949.5万辆&#xff0c;占全球比重超60%&#xff0c;产销连…

OpenSearch 与 Elasticsearch:哪个开源搜索引擎适合您?

当谈论到搜索引擎产品时&#xff0c;Elasticsearch 和 OpenSearch 是两个备受关注的选择。它们都以其出色的功能和灵活性而闻名&#xff0c;但在一些方面存在一些差异。在本文中&#xff0c;我们将从功能和延展性、工具与资源、价格和许可这三个角度对这两个产品进行论述。通过…

柚见第十一期(前端页面开发)

创建队伍 便于控制样式,在外面套一层div 创建假数据模拟后端传来数据 //假数据模拟 const initFormData { "name": "", "description": "", "expireTime": "", "maxNum": 0, "passwor…

jvisualvm保姆级教程

这里写目录标题 背景步骤VisualVM是什么官网下载安装gc插件监控本地java项目我们看看有哪些监控指标 远程java应用监控JMXjstatd 总结 背景 在有时候我们需要分析java应用的一些内存、gc等情况进行性能分析。我们往往需要一些性能分析利器&#xff0c;而VisualVM算是其中一个&…

C# 用Trace.WriteLine输出调试信息无法查看

写程序就会遇见BUG&#xff0c;这时候在代码不同部位输出一些标记的信息对查找错误非常有必要&#xff0c;一般情况下我们都是使用Console.WriteLine()方法来打印信息到控制台窗口&#xff0c;但有时候使用Console.WriteLine()方法会存在不方便的情况&#xff0c;比如鄙人遇到的…

javaEE8(数据库编程课后习题1,2)

一&#xff1a; 二&#xff1a; 数据库内信息&#xff1a; 登录&#xff1a; 注册&#xff1a; Register.jsp <% page pageEncoding"UTF-8" import"java.sql.*"%> <!DOCTYPE html> <html lang"en"> <head> <…

微信支付商户号如何开通 0.2% 提现费率?

微信支付商户号如何开通 0.2% 提现费率&#xff1f; 先说结论&#xff1a;本地面对面收款0.2%有可能&#xff0c;但线上不可能0.2%&#xff01;因为没利润&#xff01; 天下没有免费的午餐&#xff0c;所以不要被骗了。 支付宝和微信商户的费率除了少数公共事业&#xff08;…

php集成修改数据库的字段

1.界面效果 2.代码 <?phpecho <form action"" method"post"><label for"table">表名:</label><input type"text" id"table" name"table"><br><div id"fieldsContaine…