C# 基于OpenCv的视觉工作流-章44-直线卡尺
本章目标:
一、卡尺原理;
二、卡尺制作;
三、卡尺定位;
四、卡尺找点;
五、拟合直线;

直线查找,用霍夫直线、边缘提取等方法也可实现,但选取的直线,需过滤处理,且当目标发生位置、角度变化时,过滤的复杂程度变得更难以捉摸。
工业应用中,要对工件进行直线查找测量,往往有更高的要求,如明确性、简单性、高效性、可控性、稳定性等,而稳定性、可控性更是关注重点。稳定性不够就会把合格的判定为不合格,相反类同;可控性要求对算法实现可控、对识别过程可控;给持续优化、提升带来更多的理论依据,由此引出了一种实用的方式,直线卡尺。
一、卡尺原理
在图像中,一条直线表现出来的形式,往往是颜色发生剧烈变化的地方(详细阅读章13-边缘提取),将这些地方瓜分细化来看,其实就是一个个的像素点。反过来,如果先找到这些颜色变化剧烈的交界点,再将这些点拟合成直线,也就找到了所需的直线。
1、划分区域
一条直线,用两个点就可以定义,所以不用捕捉交界处的所有像素点,仅需捕捉到交界处一定数量的代表点即可。本例中将卡尺划分为多个可指定数量的ROI区域,每个ROI区域计算出一个代表点。

2、区域代表点
通过ROI区域,截取出此局部图像,再将图像进行按行或列投影,得到仅一个像素一行或仅一个像素一列的图像,即按行或按列统计像素值(参考章34-投影向量)。



如下图,统计出的像素值结果是一个数组,而数组中像素值发生剧烈变化的地方即为交界点,交界点一般有两处,上升沿和下降沿,至于要取哪个点作为代表点,则由指定的搜索方向决定。本例中如果设置由黑到白取直线,则为上长沿点,由白到黑取直线,则为下降沿点。

二、卡尺制作
卡尺制作需较强的C#基础知识,本文仅介绍关键点,要完全掌握需亲身试验。
1、绘制矩形ROI
创建矩形可如下使用,参数含义网络查询即可;
RectangleF rect = new RectangleF(x, y, width, height);
2、绘制可拖拽的控制小框
同1绘制小的矩形框及圆,接着判断鼠标在控制框时,拖拽实现ROI宽高及角度控制。

3、绘制箭头(扫描方向)
绘制箭头用C#直线绘制,画3根直线即可。需要注意的是箭头方向,随着ROI旋转时自动旋转方向,要点是判断ROI旋转度数在0-360度之间,什么度数,箭头需要何时反向及转多少度。

4、绘制卡尺框
卡尺ROI即图中的青色框,根据设置个数,自动根据红色ROI尺寸,划分为指定个数;

三、卡尺定位
卡尺定位需与模板匹配相互配合,由模板匹配定位出工件的整体位置(解决工件摆放位置、角度的变化问题),在整体位置的坐标基础上,通过仿射变换(参考章20-仿射变换)定位出卡尺位置。

四、卡尺找点
遍历所有模板匹配的匹配对象,根据卡尺定位,截取ROI局部区域图像,按步骤一中描述的原理计算取得各代表点。

五、拟合直线
OpenCv拟合直线可如下使用:
var line = Cv2.FitLine(pointList, DistanceTypes.L2, 0, reps, aeps);
其中:参数1,点数组;
参数2,为距离计算方式;
参数3,为距离计算的附加参数;
参数4,为半径精度(直线到原点的距离精度阈值,默认 0.01),数值越小,精度越高;
参数5,为角度精度(直线方向向量的角度变化阈值,默认 0.01),数值越小,精度越高;

参考链接
https://blog.csdn.net/weixin_40280870/article/details/131351519
https://blog.csdn.net/qq_37299618/article/details/119606955
https://blog.csdn.net/qq_42857680/article/details/126500909
"VisionTool 探迹"免费视觉工具
下载地址:https://pan.baidu.com/s/11tktKOSnepLNIEqNbvnv6w?pwd=qv5i
"VisionTool Halcon"付费视觉工具
下载地址:https://pan.baidu.com/s/1v832KTonDYS6oNnWG2iZtQ?
对应系列文章"C# 基于Halcon的视觉工作流",欢迎前往阅读。
上述内容需要一定的技术功底,本章至此已结束,欢迎阅读下章,谢谢!