TA的每日心情 | 慵懒 昨天 10:09 |
---|
签到天数: 3411 天 连续签到: 13 天 [LV.Master]2000FPS
|
发表于 2020-3-13 13:07:05
|
显示全部楼层
|阅读模式
来自:广东省东莞市 联通
注册登陆后可查看附件和大图,以及购买相关内容
您需要 登录 才可以下载或查看,没有账号?注册会员
x
在群里看到一个很有意思的问题,就是求曲线(含直线、曲线、弧线段等)上面所有点的坐标。这类问题,好像每年毕业设计时,都会遇到几个人问,在这里给出一个解决方法:lol。这个问题,粗看其实感觉很简单,曲线嘛,那么明显,轮廓肯定是能弄出来的撒。如下图所示需求:
求曲线上所有点的坐标
求曲线上所有点的坐标
我们先用NI VISION中的轮廓来检测一下看看效果:
视觉助手轮廓
视觉助手很顺利的把曲线的轮廓提取出来了。但是,曲线,在这里实际表达的是这么一条线,不管他有多粗多细,我们要的就是这条线。而取得的轮廓,则是围绕这条线的周围轮廓转了一圈。我们可以看到,在这条线截断面两边都有红色的轮廓线表示。哪怕我们可以将实际的曲线在图像中仅用一个像素来表示,实际上输出的轮廓,还是会围绕着曲线一周都有轮廓,差不多会有两倍左右的实际曲线点的轮廓点坐标。这个就与我们期望的不一样了。而且因为点与点之间是相连的距离又近,我们还不好判断,哪个是重复的。所以,这种方法,可能不是很适合。这里我们还得再想一想有什么办法可以测量出实际曲线上的所有点的坐标。
需求中,我们是需要得到曲线上的点坐标,这里的线,就是一条线,不管他粗细。那么在图像中表现,应该就是一组一个像素的点通过4或8连通连接在一起得到的曲线。如下图所示
1像素宽的曲线
图像中的曲线表示方式
那么如何实现这种需求呢?我们可以使用NI VISION中的骨架函数。将一条较粗的曲线骨架为一像素的曲线。当然,这里的曲线不能太粗了,如果太粗,则在两端可能会表现为分叉,这个是骨架函数本身的特性。
过粗的曲线会引起分叉
粗线会有分叉
细线没有分叉
细线则完全没有分叉
中线两头有差别
中线则两头会有几个点的差别
所以,如果是不规则随手画的曲线,可能会存在细微的差别,特别是两端,会多出几个像素点的表示。如果是这种情况,又结果有影响,那就只能再想一下办法,把这处点忽略掉。
下面我们来看一下实际的测量效果:
8连通
4连通
4连通
8连通
因为骨架输出的是4连通的。则其转向路径只能是上下左右。如果我们实际点按4连通走的话,则与骨架的点是一致的,这时只需要处理骨架的点即可。如果我们实际点是按8连通走的,即除了上下左右之外,左上、右上、左下、右下四个方向也要考虑时,则再需要考虑使用提取轮廓上的点函数来处理。这个函数输出的是8连通的点。
4连通转向只能上下左右(红色路径)
8连通有8个方向可以转向(蓝色路径,红色的为4连通路径)
4连通,连续性要好,但是精密性不强。8连通则相反,连续性不佳,精密性要好。具体使用什么方法,则看自己需要。
示例附件下载LabVIEW2019SP1版+NI VISION2019SP1
曲线坐标点.rar
(93.74 KB, 下载次数: 1, 售价: 5 元)
|
|