一种求角平分线方法—VisionPro脚本实现
1. 角平分线定义:
从一个角的顶点引出一条射线(线在角内),把这个角分成两个完全相同的角,这条射线叫做这个角的角平分线(bisectorof angle)。
角平分线是在角的型内及形上,到角两边距离相等的点的轨迹。(具体如附图)
2. 在VisionPro中创建角平分线
VisionPro中软件中没有提供封装好的角平分线工具,下面我 们介绍一种方法通过Vpro脚本实现角平分线的创建。
2. 求角平分线的脚本Angular bisector
3. 角平分线计算的理和过程
输入图像和直线A,B
把直线A,B的坐标空间映射到输入图像Image中,创建两条新 lineAMapped和lineBMapped
获取直线lineAMapped和直线lineAMapped上的参考点A(xA,yA,rA)和B(xB,yB,rB),这里的角度为指向相对于坐标系X轴的角度。
求取两条直线之间的角度β
计算两条直线平分线的角度MidAngle,这里需要判断是否为锐角
过两条直线上参考点的中心点建立一条垂直与角平分线的直线Cutline
分别求Cutline与lineAMapped的交点,以及Cutline与lineBMapped的交点,两个交点的中点设置为角平分线的参考点。
输出角平分线和对应角度(将弧度转换为角度)
运行效果如图
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脚本实现相关推荐
- Matlab两种求相位的方法
在matlab中有两种求相位方法. 1.使用phase函数. 比如a = 1+j*2 phase(a),则可以就a的相位.这个函数取实部为x轴,虚部为y轴. 2.使用函数atan2. atan2(y, ...
- 怎么创建计算机快捷方式到桌面两种方法,使用脚本主机创建Windows快捷方式 - Windows Client | Microsoft Docs...
如何使用脚本宿主创建Windows快捷方式 12/03/2020 本文内容 本文介绍如何通过使用 Microsoft Windows Script Host (WSH) Visual FoxPro 创 ...
- Shell脚本8种字符串截取方法总结
这篇文章主要介绍了Shell脚本8种字符串截取方法总结,每个方法给出了实例代码和操作结果,一目了然,需要的朋友可以参考下 Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http:/ ...
- 一种求周期二元线性序列的极小多项式的方法
一种求线性周期序列的极小多项式和线性复杂度的方法 前面说到了BM算法,这里再介绍一个求周期序列的线性复杂度的方法.本方法看起来似乎比Berlekamp-Massey算法(BM算法一般用于求有限长序列的 ...
- 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+ ...
- VisionPro之脚本(一文读懂VisionPro脚本原理与使用方法)
文章目录 一.脚本简介 二.脚本类与方法 三.脚本使用案例 四.脚本进阶 一.脚本简介 1.1 VisionPro项目组成简介 在介绍脚本之前先简单介绍一下VisionPro开发环境(QuickBui ...
- 【MATLAB】几种求矩阵伪逆的方法
几种求矩阵伪逆的方法 A*x=y当A不可逆如何解x 求伪逆有五种方法,左右同时乘以A','chol()分解,qr() 分解,svd()分解和pinv()求伪逆,下面来比较一下哪个最优秀. 如果A是个3 ...
- linux 循环 cpu使用率脚本,监控CPU使用率的三种方法(shell脚本)
监控CPU使用率的三种方法(shell脚本),供大家学习参考. 方法一: 复制代码 代码如下: #!/bin/sh #监控CPU使用率 #Written by Chameleon #Http://ch ...
- VisionPro脚本详解
一.VisionPro脚本的种类及功能 VisionPro 脚本可以定制或扩展 QuickBuild 的功能,主要表现在以下几个方面: 根据其他工具的运行结果有条件的运行视觉工具 对视觉工具的执行结果 ...
最新文章
- c语言程序改错类型,C语言程序改错总结
- python常见函数
- Java 实现 SSH 协议的客户端登录认证方式--转载
- Visual Studio Code连接SQL SERVER 2019
- Hash冲突处理终极版
- 关于蓝牙服务UUID自定义简介
- 算法五——字符串匹配(上)
- pythonqt5plaintextedit某一行的内容_如何能够做到持续输出内容?
- 北京四中院在线裁定一起跨国离婚案
- Linux非root用户如何使用80端口启动程序
- 河套学院2018级计算机一级考试,河套学院2018-2019学年本科生就业率
- centos6添加系统服务
- ASP.NET Web API项目自动生成接口文档和测试页面
- Hyper-V安裝筆記
- windows10的etc路径下没有hosts文件
- thinkphp5.1生成错误日志文件以及Evn的使用
- miui 9 android pay,小米9多功能NFC再升级,Mi Pay线上支付上线
- python Pygame的具体使用讲解
- 电路原理笔记整理,电路原理知识点总结.doc
- 2022深圳国际清洁技术与设备展览会
热门文章
- 5.12 WOW协议之谜
- 树莓派初体验,超级便宜的服务器~
- lzb有博客了233
- (手机版数据同步)财务注册公司工商服务类企业网站源码 公司注册财会类网站织梦模板
- 华为OD机试之用户调度问题(Java源码)
- 计算机教学学生创新能力,如何在信息技术教学中培养学生创新能力
- UCOSiii难疑之——“OS_SAFETY_CRITICAL”
- 计算机中常见乱码原因及分析
- 命令行subl_使用Subl.exe从命令行打开Sublime文本(Windows)
- Processing实现Google新图标