1. 角平分线定义:

  1. 从一个角的顶点引出一条射线(线在角内),把这个角分成两个完全相同的角,这条射线叫做这个角的角平分线(bisectorof angle)。

  2. 角平分线是在角的型内及形上,到角两边距离相等的点的轨迹。(具体如附图)

2. 在VisionPro中创建角平分线

  1. VisionPro中软件中没有提供封装好的角平分线工具,下面我 们介绍一种方法通过Vpro脚本实现角平分线的创建。

2. 求角平分线的脚本Angular bisector

3. 角平分线计算的理和过程

  1. 输入图像和直线A,B

  2. 把直线A,B的坐标空间映射到输入图像Image中,创建两条新 lineAMapped和lineBMapped

  3. 获取直线lineAMapped和直线lineAMapped上的参考点A(xA,yA,rA)和B(xB,yB,rB),这里的角度为指向相对于坐标系X轴的角度。

  4. 求取两条直线之间的角度β

  5. 计算两条直线平分线的角度MidAngle,这里需要判断是否为锐角

  6. 过两条直线上参考点的中心点建立一条垂直与角平分线的直线Cutline

  7. 分别求Cutline与lineAMapped的交点,以及Cutline与lineBMapped的交点,两个交点的中点设置为角平分线的参考点。

  8. 输出角平分线和对应角度(将弧度转换为角度)

  1. 运行效果如图

4. VisionPro脚本参考代码:

public override bool GroupRun(ref string message, ref CogToolResultConstants result){// To let the execution stop in this script when a debugger is attached, uncomment the following lines.// #if DEBUG// if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();// #endif///定义输入图像和初始化输出信号CogImage8Grey image = mToolBlock.Inputs["Image"].Value as CogImage8Grey;mToolBlock.Outputs["MidLine"].Value = null;mToolBlock.Outputs["MidLineAngle"].Value = 999.999;///定义lineA和lineB两条直线,并把输入的直线赋值给图像// Run each tool using the RunTool functionforeach(ICogTool tool in mToolBlock.Tools)mToolBlock.RunTool(tool, ref message, ref result);CogLine lineA = mToolBlock.Inputs["LineA"].Value as CogLine;CogLine lineB = mToolBlock.Inputs["LineB"].Value as CogLine;///把lineA和lineB的坐标空间映射到输入图像的坐标空间中,创建lineAMapped和lineBMapped两条新的直线CogLine lineAMapped = lineA.Map(image.GetTransform(image.SelectedSpaceName, lineA.SelectedSpaceName), CogCopyShapeConstants.All) as CogLine;CogLine lineBMapped = lineB.Map(image.GetTransform(image.SelectedSpaceName, lineB.SelectedSpaceName), CogCopyShapeConstants.All) as CogLine;///获取两条线的参考点 Line Reference Point(XY和角度R,该角度为相对于X轴的角度,以弧度表示)double xA, yA, rA, xB, yB, rB;lineAMapped.GetXYRotation(out xA, out yA, out rA);                              //获得lineAMapped参考点lineBMapped.GetXYRotation(out xB, out yB, out rB);                              //获得lineBMapped参考点/// 计算lineAMapped和lineBMapped 之间的角度double dxA = Math.Cos(rA);double dyA = Math.Sin(rA);double dxB = Math.Cos(rB);double dyB = Math.Sin(rB);double dot= dxA * dxB + dyA * dyB;                                               // dot为向量A和向量B的点积dot = Math.Min(1.0, Math.Max(-1.0, dot));                                        //设定dot为单位向量-1.0 - 1.0之间的值double angSpan = Math.Acos(dot);                                                 //获得两条直线之间的夹角///通过判定找到角平分线的夹角MidAngledouble midAngle0 = rA + angSpan / 2.0;                                           //LineA上方角度double midAngle1 = rA - angSpan / 2.0;                                           //LineA下方角度double x0, y0, x1, y1;x0 = Math.Cos(midAngle0);                                                        //LineA上方的参考点XYy0 = Math.Sin(midAngle0);x1 = Math.Cos(midAngle1);                                                        //LineA下方的参考点XYy1 = Math.Sin(midAngle1);double dot0 = x0 * dxB + y0 * dyB;                                               //dot0 为上方参考点向量与LineB向量的点积double dot1 = x1 * dxB + y1 * dyB;                                               //dot1 为下方参考点向量与LineB向量的点积double midAngle = midAngle0;if (dot0 < dot1)                                                                 //dotx 值越说明与LineB的夹角(Acos(dotx))越小,最终输出LineA和LineB两线之间的夹角midAngle = midAngle1;/// 计算角平分线的交点CogLine cutLine = new CogLine();  cutLine.SelectedSpaceName = image.SelectedSpaceName;cutLine.SetXYRotation((xA + xB) / 2.0, (yA + yB) / 2.0, midAngle+Math.PI/2.0);  //创建一条角平分线的垂线CogIntersectLineLineTool lineLineIntersectA = new CogIntersectLineLineTool();   //计算LineA和垂线CutLine的交点lineLineIntersectA.InputImage = image;lineLineIntersectA.LineA = cutLine;lineLineIntersectA.LineB = lineAMapped;lineLineIntersectA.Run();CogIntersectLineLineTool lineLineIntersectB = new CogIntersectLineLineTool();   //计算LineB和垂线CutLine的交点lineLineIntersectB.InputImage = image;lineLineIntersectB.LineA = cutLine;lineLineIntersectB.LineB = lineBMapped;lineLineIntersectB.Run();if (lineLineIntersectA.Intersects && lineLineIntersectB.Intersects)             //如果LineA和LineB不平行,说明两线相交,则输出交点{double centerX= (lineLineIntersectB.X + lineLineIntersectA.X) / 2.0; double centerY= (lineLineIntersectB.Y + lineLineIntersectA.Y) / 2.0; CogLine midLine = new CogLine();midLine.SelectedSpaceName = image.SelectedSpaceName;midLine.SetXYRotation(centerX, centerY, midAngle);mToolBlock.Outputs["MidLine"].Value = midLine;                                //输出角平分线(锐角)mToolBlock.Outputs["MidLineAngle"].Value = CogMisc.RadToDeg( midAngle);       //输出角平分线的角度(相对X轴的弧度)}    return false;}

5. 更多内容

V+视觉编程软件下载以及更多视觉资源内容请搜索”德创视觉之家“微信小程序或者关注”德创测控“公众号

一种求角平分线方法—VisionPro脚本实现相关推荐

  1. Matlab两种求相位的方法

    在matlab中有两种求相位方法. 1.使用phase函数. 比如a = 1+j*2 phase(a),则可以就a的相位.这个函数取实部为x轴,虚部为y轴. 2.使用函数atan2. atan2(y, ...

  2. 怎么创建计算机快捷方式到桌面两种方法,使用脚本主机创建Windows快捷方式 - Windows Client | Microsoft Docs...

    如何使用脚本宿主创建Windows快捷方式 12/03/2020 本文内容 本文介绍如何通过使用 Microsoft Windows Script Host (WSH) Visual FoxPro 创 ...

  3. Shell脚本8种字符串截取方法总结

    这篇文章主要介绍了Shell脚本8种字符串截取方法总结,每个方法给出了实例代码和操作结果,一目了然,需要的朋友可以参考下 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http:/ ...

  4. 一种求周期二元线性序列的极小多项式的方法

    一种求线性周期序列的极小多项式和线性复杂度的方法 前面说到了BM算法,这里再介绍一个求周期序列的线性复杂度的方法.本方法看起来似乎比Berlekamp-Massey算法(BM算法一般用于求有限长序列的 ...

  5. python帕多瓦数列前n项和的_几种求数列前n项和的方法

       1 1 1 1 1 1 1 1 n n n na q S a q a a q q q q              常见的数列的前 n 项和: , 1+3+5+ ...

  6. VisionPro之脚本(一文读懂VisionPro脚本原理与使用方法)

    文章目录 一.脚本简介 二.脚本类与方法 三.脚本使用案例 四.脚本进阶 一.脚本简介 1.1 VisionPro项目组成简介 在介绍脚本之前先简单介绍一下VisionPro开发环境(QuickBui ...

  7. 【MATLAB】几种求矩阵伪逆的方法

    几种求矩阵伪逆的方法 A*x=y当A不可逆如何解x 求伪逆有五种方法,左右同时乘以A','chol()分解,qr() 分解,svd()分解和pinv()求伪逆,下面来比较一下哪个最优秀. 如果A是个3 ...

  8. linux 循环 cpu使用率脚本,监控CPU使用率的三种方法(shell脚本)

    监控CPU使用率的三种方法(shell脚本),供大家学习参考. 方法一: 复制代码 代码如下: #!/bin/sh #监控CPU使用率 #Written by Chameleon #Http://ch ...

  9. VisionPro脚本详解

    一.VisionPro脚本的种类及功能 VisionPro 脚本可以定制或扩展 QuickBuild 的功能,主要表现在以下几个方面: 根据其他工具的运行结果有条件的运行视觉工具 对视觉工具的执行结果 ...

最新文章

  1. c语言程序改错类型,C语言程序改错总结
  2. python常见函数
  3. Java 实现 SSH 协议的客户端登录认证方式--转载
  4. Visual Studio Code连接SQL SERVER 2019
  5. Hash冲突处理终极版
  6. 关于蓝牙服务UUID自定义简介
  7. 算法五——字符串匹配(上)
  8. pythonqt5plaintextedit某一行的内容_如何能够做到持续输出内容?
  9. 北京四中院在线裁定一起跨国离婚案
  10. Linux非root用户如何使用80端口启动程序
  11. 河套学院2018级计算机一级考试,河套学院2018-2019学年本科生就业率
  12. centos6添加系统服务
  13. ASP.NET Web API项目自动生成接口文档和测试页面
  14. Hyper-V安裝筆記
  15. windows10的etc路径下没有hosts文件
  16. thinkphp5.1生成错误日志文件以及Evn的使用
  17. miui 9 android pay,小米9多功能NFC再升级,Mi Pay线上支付上线
  18. python Pygame的具体使用讲解
  19. 电路原理笔记整理,电路原理知识点总结.doc
  20. 2022深圳国际清洁技术与设备展览会

热门文章

  1. 5.12 WOW协议之谜
  2. 树莓派初体验,超级便宜的服务器~
  3. lzb有博客了233
  4. (手机版数据同步)财务注册公司工商服务类企业网站源码 公司注册财会类网站织梦模板
  5. 华为OD机试之用户调度问题(Java源码)
  6. 计算机教学学生创新能力,如何在信息技术教学中培养学生创新能力
  7. UCOSiii难疑之——“OS_SAFETY_CRITICAL”
  8. 计算机中常见乱码原因及分析
  9. 命令行subl_使用Subl.exe从命令行打开Sublime文本(Windows)
  10. Processing实现Google新图标