Halcon求三点中心,三角形重心、三角形外接圆外心和内切圆内心

news2024/9/25 13:21:36

本文涉及几何问题,求角平分线,垂直平分线以及中线,不止可以应用于点和三角形,其他需求可选择性提取。

求角平分线:http://t.csdnimg.cn/QYZOK

求垂直平分线:http://t.csdnimg.cn/A4wWD

三角形的重心,外心,垂心,内心和旁心称之为三角形的五心。三角形的中心一般为三角形的重心,重心为三角形三边中线交点。

外心,即三角形外接圆圆心,为三角形三边垂直平分线的交点。

内心,即三角形内切圆圆心,为三角形三角的角平分线的交点。其他两心这里不展开介绍。

下面是待处理图片,求这三点的中心,三角形外接圆以及三角形内切圆。

图片中是三个圆孔,先求圆心,再连接得到三角形

*1.边缘检测
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
select_shape_xld (ContoursSplit, SlectedXLD, 'circularity', 'and', 0.5, 1.0)
*拟合圆,得到各圆圆心坐标
fit_circle_contour_xld (SlectedXLD, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle (CircleA, Row[0], Column[0], Radius[0])
gen_circle (CircleB, Row[1], Column[1], Radius[1])
gen_circle (CircleC, Row[2], Column[2], Radius[2])
dev_set_draw ('margin')
dev_set_color ('pink')
dev_display (CircleA)
dev_display (CircleB)
dev_display (CircleC)

*绘制三角形三边,以圆心坐标定顶点
gen_region_line (RegionLines01, Row[0], Column[0], Row[1], Column[1])
gen_region_line (RegionLines02,Row[0], Column[0], Row[2], Column[2])
gen_region_line (RegionLines12, Row[1], Column[1], Row[2], Column[2])
union2 (RegionLines01, RegionLines02, RegionUnion1)
union2 (RegionLines12, RegionUnion1, RegionUnion)
gen_contour_region_xld (RegionUnion, TriangleContour, 'border')
dev_set_color ('blue')
dev_display (TriangleContour)

得到三角形如下:

因为这里需要分别对三个点和三条边做处理,可以选择创建新函数,后面直接调参使用,减少冗余步骤。

选中编辑好的函数,右键点击“创建新函数”,

确定需要的输入参数和输出参数,函数中内部可以生成或‘消化’的参数可以移除。

上面部分是都需要做处理的,下面的根据需求选择。

1.求三角形重心

我也理解为求取三点中心,这个没有资料可以确定。可以连接三点为三角形,求其重心。

gen_contour_region_xld (RegionLines01, Contours01, 'border')
*获取直线中点
area_center_points_xld (Contours01, Area, Row01, Column01)
gen_region_line (MidLines01, Row01, Column01, Row2, Column2)
gen_contour_region_xld (MidLines01, MidContour01, 'border')
dev_set_color ('spring green')
dev_display (MidContour01)
return ()

选中以上代码,创建新函数

drawline_midian ( RegionLines01 : MidContour01 : Row2, Column2 : )

参数依次为输入边,输出中线,输入边的对边顶点坐标。

对三角形三边都调用上面的函数求取中线,再求取交点:

*求三角形中心,即重心,三边中线交点
drawline_midian (RegionLines01, MidContour01, Row2, Column2)
drawline_midian (RegionLines02, MidContour02, Row[1], Column[1])
drawline_midian (RegionLines12, MidContour12, Row[0], Column[0])
*求交点
intersection_contours_xld (MidContour01, MidContour02, 'mutual', RowCentroid, ColumnCentroid, IsOverlapping3)
dev_set_color ('white')
disp_cross (WindowHandle, RowCentroid, ColumnCentroid, 20, 0)

运行得到如下效果,图中白色交点为三角形中心和重心,我也理解为这三点的中心(存疑)。

2.求三角形外接圆

对以下代码部分创建新函数:

gen_contour_region_xld (RegionLines1, Contours1, 'border')
*获取直线角度
elliptic_axis_points_xld (Contours1, Ra1, Rb1, Phi1)
*获取直线中点
area_center_points_xld (Contours1, Area, Row1, Column1)
*垂线长度,可以调整数值,延长线的长度,利用角度比例关系
LineLength:=400
*起点
RowStart := Row1-cos(Phi1)*LineLength
ColStart := Column1-sin(Phi1)*LineLength
*终点
RowEnd := Row1+cos(Phi1)*LineLength
ColEnd := Column1+sin(Phi1)*LineLength
gen_region_line (MidnormalLine1, RowStart, ColStart, RowEnd, ColEnd)
gen_contour_region_xld (MidnormalLine1, MidnormalContour, 'border')
dev_set_color ('magenta')
dev_display (MidnormalContour)
return ()

drawline_midnormal ( RegionLines1 : MidnormalContour : : LineLength )

参数依次为:输入边,输出垂直平分线,垂直平分线的长度

求交点:

这里的交点是求取两条线的轮廓的交点,由于轮廓没有特别精细,识别出来的交点是一小块区域包含了非常相近的多组行列坐标[]。因为差别不大,本文需求不需要特别精细,这里选取了第一组行列坐标Row[0],Column[0]。

*求外接圆,求三边垂直平分线
drawline_midnormal (RegionLines01, MidnormalContour1, LineLength)
drawline_midnormal (RegionLines02, MidnormalContour2, LineLength)
drawline_midnormal (RegionLines12, MidnormalContour3, LineLength)
*求交点
intersection_contours_xld (MidnormalContour1, MidnormalContour2, 'mutual', RowCenter, ColumnCenter, IsOverlapping2)
dev_set_color ('red')
disp_cross (WindowHandle, RowCenter[0], ColumnCenter[0], 20, 0)
*计算圆心到三角形顶点距离
distance_pp (Row[0], Column[0], RowCenter[0], ColumnCenter[0], DistanceR)
*绘制外接圆
gen_circle_contour_xld (Circumcircle, RowCenter[0], ColumnCenter[0], DistanceR, 0, 6.28318, 'positive', 1)
disp_cross (WindowHandle, RowCenter, ColumnCenter, 20, 0)
dev_display (Circumcircle)

外接圆到各个顶点的半径一样,这里选取任意顶点到交点的距离作为半径画圆,效果如下:

3.求三角形内切圆

求取角平分线在代码里实现这个过程比较复杂,可以参考文章最上面的链接结合图片理解:

这里简单介绍一下:

(1)分别对三个顶点重新画同半径大小的圆(可以小一点),每个顶点的圆都会与角两边有交点;

(2)得到六个交点;

(3)分别对六个交点重新画同半径大小的圆(可以大一点),每个角的方向画出来的两个圆会得到两个交点,连接两个交点即为角平分线。

(4)延长角平分线。(可以求取线性方程,或者自定义长度,2和3的代码中延长线方法不一样)

对以下代码部分创建新函数,

*以圆心重新绘制圆,半径自定义,大圆方便观察
gen_circle_contour_xld (ContCircleA, Row, Column, 50, 0, 6.28318, 'positive', 1)
dev_set_color ('green')
dev_display (ContCircleA)
*获取圆与三角形轮廓的交点
intersection_contours_xld (TriangleContour, ContCircleA, 'all', Rowa, Columna, IsOverlapping0)
*以交点为圆心画两个同半径圆,两圆交点与三角形顶点连线角平分线
gen_circle_contour_xld (ContCircleA1, Rowa[0], Columna[0], 80, 0, 6.28318, 'positive', 1)
gen_circle_contour_xld (ContCircleA2, Rowa[1], Columna[1], 80, 0, 6.28318, 'positive', 1)
intersection_contours_xld (ContCircleA1, ContCircleA2, 'all', Row1, Column1, IsOverlapping)
* gen_region_line (RegionLines, Row1[0], Column1[0], Row1[1], Column1[1])
* gen_contour_region_xld (RegionLines, AngleBisectors, 'border')

*延长角平分线,求线性方程
r:= Row1[0] - Row1[1]
n:= Column1[0] - Column1[1]
k1:= r/n
b1:=Row1[1] - k1*Column1[1]
row11:=k1*1100+b1
row12:=k1*1500+b1
dev_set_color ('yellow')
disp_line (WindowHandle, row11, 1100, row12, 1500)
gen_region_line (RegionLines, row11, 1100, row12, 1500)
gen_contour_region_xld (RegionLines, AngleBisectors, 'border')
return ()

求取交点,并求交点到三角形三边的最短距离作半径画圆:

*求内切圆,找角平分线并延长
drawline_angle_bisector (TriangleContour, AngleBisectorsA, Row[0], Column[0], WindowHandle)
drawline_angle_bisector (TriangleContour, AngleBisectorsB, Row[1], Column[1], WindowHandle)
drawline_angle_bisector (TriangleContour, AngleBisectorsC, Row2, Column2, WindowHandle)
*求圆心,intersection_lines用直线坐标求,intersection_contours_xld用轮廓求
intersection_contours_xld (AngleBisectorsA, AngleBisectorsB, 'mutual', CenterRow, CenterColumn, IsOverlapping1)
*求圆心到三角形边的最短距离
distance_pc (TriangleContour, CenterRow, CenterColumn, DistanceMin, DistanceMax)
gen_circle_contour_xld (CenterCircle, CenterRow, CenterColumn, DistanceMin, 0, 6.28318, 'positive', 1)
dev_set_color ('violet red')
disp_cross (WindowHandle, CenterRow, CenterColumn, 20, 0)
dev_display (CenterCircle)

效果如下:

再整理一下延长线的方法吧.

4.延长直线

已得到直线上的两个以上的点,Row[ ],Column[ ]为直线上的坐标数组

(1)求线性方程

任意选取两个点的坐标求线性方程y=ax+b。

*延长角平分线
r:= Row[0] - Row[1]
n:= Column[0] - Column[1]
k1:= r/n
b1:=Row[1] - k1*Column[1]
*定义起始坐标和结束坐标
colstart:=1100
colend:=1500
rowstart:=k1*colstart+b1
rowend:=k1*colend+b1
dev_set_color ('yellow')
disp_line (WindowHandle, rowstart, colstart, rowend, colend)
gen_region_line (RegionLines, rowstart, colstart, rowend, colend)
gen_contour_region_xld (RegionLines, AngleBisectors, 'border')

(2)利用直线角度比例

gen_region_line (RegionLines1, Row[0], Column[0], Row[1], Column[1])
gen_contour_region_xld (RegionLines1, Contours1, 'border')
*获取直线角度
elliptic_axis_points_xld (Contours1, Ra1, Rb1, Phi1)
*获取直线中点
area_center_points_xld (Contours1, Area, Row1, Column1)
*垂线长度
LineLength:=400
*起点
RowStart := Row1-cos(Phi1)*LineLength
ColStart := Column1-sin(Phi1)*LineLength
*终点
RowEnd := Row1+cos(Phi1)*LineLength
ColEnd := Column1+sin(Phi1)*LineLength
gen_region_line (MidnormalLine1, RowStart, ColStart, RowEnd, ColEnd)
gen_contour_region_xld (MidnormalLine1, MidnormalContour, 'border')

OKOK,下班,又困又饿。

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

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

相关文章

JDK bug:ciObjectFactory::create_new_metadata:原因完全解析

文章目录 1、问题2.详细日志2.关键日志3.结论4.JDK:bug最终bug链接: 京东遇到过类似bug各位大佬如果有更详细的解答可以留言。 1、问题 服务不通,接口404,查看日志有一下截图,还有一个更详细的日志 2.详细日志 # #…

如何在公网环境下使用Potplayer访问本地群晖webdav中的影视资源

文章目录 本教程解决的问题是:按照本教程方法操作后,达到的效果是:1 使用环境要求:2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透,映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

青少年CTF-qsnctf-Web-Queen

题目环境: 题目难度:★★ 题目描述:Q的系统会不会有漏洞? 看到了登录窗口,使用burp suite工具进行抓包 burp suite抓包 admin 1 Repeater重放Send放包 Your IP is not the administrator’s IP address! 您的IP不是管理…

张驰咨询:程序员如何利用六西格玛培训优化代码质量和工作效率?

在当今这个以数据驱动决策和追求极致效率为标杆的商业世界中,“六西格玛”(Six Sigma)不再仅是精益管理的术语,它已经成为提升个人和组织竞争力的重要法宝。让我们一起揭开六西格玛在职场培训中的神秘面纱,探索如何用它来精进自己的工作和生活…

位操作符详解(C语言)

前言 C语言中的位操作符是用来对数据的二进制表示进行位级操作的运算符。这些操作符包括位与(&)、位或(|)、位异或(^)、位取反(~),这些位操作符可以用来进行各种位级…

御云出海记 | 引领泰国数字化基础设施,共推AI应用未来

12月18日,2023华为云泰国AI峰会如期举行。此次峰会是华为云与泰国数字经济与社会部(MDES)共同举办,汇聚了政府代表、行业专家、本地客户、合作伙伴及中国企业,共同探讨泰国的AI发展和数字化转型。 万博智云有幸作为华…

通用的java中部分方式实现List<自定义对象>转为List<Map>

自定义类 /*** date 2023/12/19 11:20*/ public class Person {private String name;private String sex;public Person() {}public Person(String name, String sex) {this.name name;this.sex sex;}public String getName() {return name;}public String getSex() {return…

100GPTS计划-AI写作VersatileWriter

地址 https://chat.openai.com/g/g-zHErU9z9m-versatile-writer https://poe.com/VersatileWriterGPT 测试 翻译:要求将给定的英语语句翻译成中文。 总结:给出一段文本,要求进行概括和总结。 问答:根据给定段落,提出相关问题并给出答案。 推理:给出前提,进行多步推理并得…

CloudPulse:一款针对AWS云环境的SSL证书搜索与分析引擎

关于CloudPulse CloudPulse是一款针对AWS云环境的SSL证书搜索与分析引擎,广大研究人员可以使用该工具简化并增强针对SSL证书数据的检索和分析过程。 在网络侦查阶段,我们往往需要收集与目标相关的信息,并为目标创建一个专用文档&#xff0c…

部分常用算法笔记

一、简单易考 1、冒泡排序 https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896 for i:0;i<length;i { for j:0;j<length-i-1;j { if array[j] > array[j1] { array[j1],array[j] array[j],array[j1] } } } 2、求数组最大最小值。 1&#xff09;O(…

Android studio中导入opencv库

具体opencv库的导入流程参考链接&#xff1a;Android Studio开发之路 &#xff08;五&#xff09;导入OpenCV以及报错解决 一、出现的错误&#xff1a;NullPointerException: Cannot invoke “java.io.File.toPath()” because “this.mySdkLocation” is null 解决办法&#…

从零开发短视频电商 在AWS上用SageMaker部署自定义模型

文章目录 简介使用model.tar.gz1.从huggingface上下载模型2.自定义代码3.打包为tar 文件4.上传model.tar.gz到S35.部署推理 使用hub1.在sagemaker上新建个jupyterlab2.上传官方示例ipynb文件3.指定HF_MODEL_ID和HF_TASK进行部署和推理 简介 原始链接&#xff1a;https://huggi…

linux中deadline调度原理与代码注释

简介 deadline调度是比rt调度更高优先级的调度&#xff0c;它没有依赖于优先级的概念&#xff0c;而是给了每个实时任务一定的调度时间&#xff0c;这样的好处是&#xff1a;使多个实时任务场景的时间分配更合理&#xff0c;不让一些实时任务因为优先级低而饿死。deadline调度…

未来五年工业AI的八大发展趋势

随着ChatGPT和生成式人工智能&#xff08;AI&#xff09;进入到大众的视线&#xff0c;突然之间&#xff0c;它成为世界上最热门的讨论话题之一。 不过&#xff0c;在制造业&#xff0c;这并不完全是件新鲜事。十多年来&#xff0c;机器学习&#xff08;ML&#xff09;技术一直…

1-交易系统设计的一些原则

高并发原则 无状态 如果设计的应用是无状态的&#xff0c;那么应用比较容易进行水平扩展。实际生产环境可能是这样的&#xff1a;应用无状态&#xff0c;配置文件有状态。比如&#xff0c;不同的机房需要读取不同的数据源&#xff0c;此时&#xff0c;就需要通过配置文件或配…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜E

老老规矩&#xff0c;看目录&#xff0c;平均每年2E&#xff0c;跟2D一样&#xff0c;D是全对&#xff0c;E是全错&#xff0c;侧面也看出10道题&#xff0c;大概是3A/B&#xff0c;3C&#xff0c;2D&#xff0c;2E&#xff0c;其实还是蛮平均的。但E为1道的情况居多。 第20题…

架构设计系列之前端架构和后端架构的区别和联系

前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 一、定位和职责 前端架构 主要关注用户界面和用户体验&#xff0c;负责处理用户与…

day53_vue+easyexcel+springboot

EasyExcel 一、初识EasyExcel 1. Apache POI 先说POI&#xff0c;有过报表导入导出经验的同学&#xff0c;应该听过或者使用。 Apache POI是Apache软件基金会的开源函式库&#xff0c;提供跨平台的Java API实现Microsoft Office格式档案读写。但是存在如下一些问题&#xf…

数据结构:图解手撕B-树以及B树的优化和索引

文章目录 为什么需要引入B-树&#xff1f;B树是什么&#xff1f;B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树&#xff1f; 回忆一下前面的搜索结构&#xff0c;有哈希&#xff0c;红黑树&#xff0c;二分…等很多的搜索结构&a…

超结MOS/低压MOS在5G基站电源上的应用-REASUNOS瑞森半导体

一、前言 5G基站是5G网络的核心设备&#xff0c;实现有线通信网络与无线终端之间的无线信号传输&#xff0c;5G基站主要分为宏基站和小基站。5G基站由于通信设备功耗大&#xff0c;采用由电源插座、交直流配电、防雷器、整流模块和监控模块组成的电气柜。所以顾名思义&#xf…