石鑫华视觉 发表于 2022-10-9 18:00:38

LabVIEW Vision三点计算圆心半径

我们知道,不在一条直线上的三个点(一条直线上,则直径是无穷大的),是可以拟合得到一个圆的,这样就可以求得圆心、半径(直径)等。那么在LabVIEW Vision中,如何来实现这个要求呢?本视觉论坛提供两种方法:

方法一:
比较简单的方法,因为三点是可以拟合成圆的,那么直接使用NI Vision中的拟合圆IMAQ Fit Circle函数来处理。
方法二:使用数学方法进行计算,来得到相应的圆心、半径等数据。计算原理,可以自行百度搜索,可查看本贴的word文档,也提供了一种计算原理,本贴的计算原理,也是使用这种计算方法。
下面来看一下效果:
先看一下程序框图:

三点计算圆心半径的程序示例框图
上述框图中,提供了上面的两种方法。上面的是函数是方法二的,使用数学方法计算三点拟合圆心和半径。下面的则是使用拟合圆函数来拟合圆心和半径。可以比较两种方法得到的数据是不是一样的。







上面的效果,两种方法得到的结果数据是一样的。也就是两种方法都是可行的。
下面再看一下,如果三个点在一条直线上的情况:


如果三点共线,数学计算方法,得到的结果是inf或nan无效数据。而拟合圆函数得到的结果是0并返回错误,错误内容是不要提供共线点。
在上面的效果中,在数学计算方法中,还使用了覆盖圆弧功能。但是在这里有点不好计算,或者是不太好判断三个点的角度。我们知道覆盖圆弧功能是要提供起点角度和终点角度的:

覆盖弧函数
但是这里,只有三个点,该如何确定起点和终点,比较麻烦,作者年纪大了,没有考虑太详细,到底该如何确认起点和终点的角度该如何确定。就比如说(200,200),(300,100),(400,200),这样三个点,表现出来,其实就是一个圆的上半弧,这里按第1点、第2点、第3点排序,那就应该是顺时针的,而在NI Vision中,则是逆时针来定义角度的,所以这里的覆盖弧的起点角度应该是第3点的、终点角度是第1点。而如果说(200,200),(300,100),(400,200),这样三个点,表现出来的是一个圆的下半弧。同样按第1点、第2点、第3点排序,则是逆时针的,这里覆盖弧的起点是第1点,逆时针经过第3点,终点角度则是第2点。另外,又还有一些比较特殊的点,例如说前面的下半弧的第三点,按理说应该是360度,这时计算角度,则可能是0度,而如果是用0度时,则得到的弧也是不一样的。所以,这里如果要覆盖弧,那么可能与期望的有一些差别。如果没有考虑清楚,还有可能有一点没有落在弧上(这种情况肯定是不对的)。所以,覆盖弧时,至少要保证3个点在圆弧上,但是到底是顺时针、逆时针,是包含三个点的小弧,还是包含三个点的大弧(效果图中的2、3图),那还得计算和判断。
示例函数版本LabVIEW2020SP1+Vision 2020SP1
示例(只有数学计算方法):

示例:数学计算方法+拟合圆方法:

覆盖点函数:

三点计算圆心半径函数(付费):

三点计算圆心半径圆心文档:

页: [1]
查看完整版本: LabVIEW Vision三点计算圆心半径

LabVIEW HALCON图像处理入门教程(24.09)
石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
《LabVIEW Vision函数实例详解2020-2024》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24