对物体中心检测的 C# 窗口程序的复盘

一、目的:

测物体的中心输出相对坐标 便于蛋糕机器人喷涂图案

二、实现的输入和输出

输入:

照相机照相 光源干扰 反光灯因素如何避免

对图像中的噪点如何处理?

加入蛋糕上面有多个圆形怎么办 取最外面的图像 不管是方形还是圆形
选择机制 加入轮廓最大的是方形就选择方形中心

输出:

1.圆形的圆心坐标
2.方形的中心坐标

结果:

输出到窗口上面显示相对于图片左上角的相对坐标 便于与现实中喷头的参考系对照

三、方法:

高斯滤波–>进行灰度处理–>进行二值化–>进行开运算–>轮廓提取–>计算中心点位
预处理:高斯滤波 二值化 灰度处理等等均可以
应用霍夫变换必须使用二值化图像
可以先执行边缘检测再执行霍夫变换
1.主要是用边缘检测中的Canny和霍夫变换中的霍夫圆,和线检测
2.圆形直接使用霍夫圆变换,方形使用Canny或者霍夫线变换
3.共同的方法是使用封装好的FindContours,找到轮廓,之后输入到ApproxPolyDP多边形拟合曲线,识别他是什么形状的,比如三角形,方形,圆形。(图像的矩)
4.轮廓优化:最后对于生成的轮廓,可以使用形态学进行优化 例如开运算

四、原理和基础知识:

  1. 高斯滤波filter:线性平滑滤波 为什么叫做高斯:处理高斯噪声 数值上符合正态分布
    对像素邻域内各像素灰度值加权平均替代中心像素的灰度值
    对整幅图像像素值进行加权平均,针对每一个像素点的值,都由其本身值和邻域内的其他像素值经过加权平均后得到。
  2. 灰度处理 BGR2Gray 就是对BGR三个数值进行操作化为灰度值 取平均值
  3. 图像分割:
    边缘检测: 检测那些灰度值急剧变化的点
    平滑滤波 边缘锐化 边缘判定 边缘连接

    Canny算法 对噪声和边缘检测的折中方案

    Canny算子的步骤是:
  4. 先进行滤波降噪。
  5. 计算梯度幅值和方向(进行Sobel算子计算)。
  6. 非极大值抑制。将模糊(blurred)的边界变得清晰(sharp)。通俗的讲,就是保留了每个像素点上梯度强度的极大值,而删掉其他的值。
  7. 滞后阈值。设定一个阈值上界和阈值下界(opencv中通常由人为指定的),图像中的像素点如果大于阈值上界则认为必然是边界(称为强边界,strong edge),小于阈值下界则认为必然不是边界,两者之间的则认为是候选项(称为弱边界,weak edge)
  8. 霍夫变换 CvInvoke.HoughCircles HoughLines
    霍夫圆变换的基本思路是认为图像上每一个非零像素点都有可能是一个潜在的圆上的一点,跟霍夫线变换一样,也是通过投票,生成累积坐标平面,设置一个累积权重来定位圆
    https://blog.csdn.net/flymoon87/article/details/82830608

利用霍夫变换

public static CircleF[] HoughCircles 取数组第一个元素 Center 输出点
public static LineSegment2D[] HoughLinesP 取lines 第一个元素 输出点P1 P1为起点
霍夫梯度法的缺点
<1> 在霍夫梯度法中,使用Sobel导数来计算局部梯度,其可以视作等同于一条局部切线,这不是一个数值稳定的做法。在大多数情况下,这样做会得到正确的结果,但或许会在输出中产生一些噪声。
<2> 在边缘图像中的整个非0像素集被看做每个中心的候选部分。因此,如果把累加器的阈值设置偏低,算法将要消耗比较长的时间。第三,因为每一个中心只选择一个圆,如果有同心圆,就只能选择其中的一个。
<3> 因为中心是按照其关联的累加器值的升序排列的,并且如果新的中心过于接近之前已经接受的中心的话,就不会被保留下来。且当有许多同心圆或者是近似的同心圆时,霍夫梯度法的倾向是保留最大的一个圆。可以说这是一种比较极端的做法,因为在这里默认Sobel导数会产生噪声,若是对于无穷分辨率的平滑图像而言的话,这才是必须的。