识别和处理目标

捕获图像后,下一步就是识别图像中的视觉目标。本文档将通过一种方法来确定2016年赛季的视觉目标。请注意,本节中使用的图像是在相机刻意将其设置为曝光不足的情况下拍摄的,经过如此配置,除了被照亮的目标外,还会产生非常暗的图像,有关详细信息,请参见“相机设置”部分。

原始图片

下图是本示例将要使用的起始图像。其使用了* FIRST * | reg |中可找到的的绿色环形灯拍摄。其可选配不同尺寸的附加环形灯。视觉代码示例提供了其他示例图像。

Sample image using a green ring light showing the retroreflective tape.

什么是HSL / HSV?

颜色的色相或色调通常出现在艺术家的色轮上,并包含红色,橙色,黄色,绿色,蓝色,靛蓝和紫罗兰色的彩虹色。色相是使用色轮上的径向角指定的,但是在实际成像中,圆的径向角通常仅包含256个单位,其从零(红色)开始,循环穿过彩虹渐变,然后在上端回绕为红色。颜色的饱和度指定颜色的浓量,或色调颜色与灰色阴影的比率。较高的比率表示更多彩色,较少灰色。零饱和度没有色相,并且完全是灰色。 “亮度”或“值”指示与色调混合的灰色阴影。黑色为0,白色为255。

该示例代码使用HSV颜色空间指定了目标的颜色。这一操作的主要原因是因为通过使用“值”(HSV)或“亮度”(HSL)分量,可以轻松地将目标相对于图像其余部分的亮度用作过滤标准。使用HSV色彩系统的另一个原因是,当在HSV色彩空间中进行阈值过滤操作时,能roboRIO上更有效地运行。

遮罩

一开始,像素值会与恒定的颜色或亮度值进行比较,以创建下面以黄色显示的二元遮罩。这一步消除了除了反光带以外的大部分像素。如果颜色相对饱和,明亮且一致,则基于颜色的遮罩效果会很好。使用HSL(色相,饱和度和亮度)或HSV(色相,饱和度和值)颜色空间时,捕捉颜色的区别通常比RGB(红色,绿色和蓝色)空间更准确。当颜色范围在一维或多个维上很大时,尤其如此。

请注意,除了目标之外,图像的其他明亮部分(顶灯和塔顶照明)也会被遮罩步骤捕获。

Masked version of the image above showing the "bright" parts of the image.

像素块分析

遮罩操作之后,像素块报告将检查像素块的面积,边界矩形和等效矩形。这些用于计算几个计分项,以帮助选择最矩形的形状。下文所述的每个测试都会生成一个分数(0-100),然后将其与预定义的分数限制进行比较,以确定像素块是否为目标。

覆盖区域

面积分数是通过将像素块的面积与像素块周围绘制的边界框的面积进行比较来计算的。全反射条的面积为80平方英寸(〜516:数学:cm ^ 2)。包含目标的矩形区域为240平方英寸(〜0.15:math:m ^ 2)。这意味着面积与边界框面积之间的理想比率为1/3。接近1/3的面积比将产生接近100的得分,比例越偏离1/3时,得分越接近0。

长宽比

长宽比得分基于(像素块宽度/像素块高度)。像素块的宽度和高度使用称为“等效矩形”的值来确定。等效矩形是边长为:math:`x`和:math:`y`的矩形,其中:math:`2x+2y`等于像素块周长,而:math:`x cdot y`等于像素块面积。等效矩形用于纵横比计算,因为与使用边框相比,等效矩形受矩形倾斜的影响较小。当使用边框矩形作为宽高比时,随着矩形的倾斜,高度会增加,宽度会减小。

视觉目标宽为20英寸(508毫米),高为12英寸(304.8毫米),比率为1.6。将检测到像素块的纵横比与该理想比例进行比较。当该比例与目标比例匹配时,纵横比得分会归一化为100,并随着该比例的变化而线性下降。

力矩

The “moment” measurement calculates how spread out each pixel is from the center of the blob. This measurement provides a representation of the pixel distribution in the particle. It can be thought of as analogous to a physics moment of inertia calculation. The ideal score for this test is ~0.28.

X / Y配置文件

A graph and LabVIEW plot showing X/Y Profiles.

边缘分数描述了像素块在X和Y方向上是否都匹配适当的轮廓。如图所示,它是使用从原始图像中提取的边界框上的行和列平均值,并将其与轮廓蒙版进行比较来计算的。根据行平均值或列平均值中上限值和下限值之间的值的数量,分数的范围为0到100。

测量

如果像素块得分足够好,其将视为目标,此时则可以计算一些实际的测量值,例如位置和距离。该示例代码包含这些基本度量,因此让我们看一下所涉及的数学以更好地理解它。

位置

像素块和边界框都很好地描述了目标位置,但是所有坐标均以像素为单位,其中0,0位于屏幕的左上角,其右边缘和下边缘由相机分辨率确定。这对于像素数学来说是一个有用的系统,但是对于驱动机器人却没有那么有用。因此,让我们将其更改为可能更有用的内容。

要将点从像素系统转换为瞄准系统,可以使用以下公式。

所得到的坐标系是接近我们想要的,但是Y轴是反着的。这可以通过将该点乘以[1,-1]来纠正。(注意:在示例代码中没有这样做)。这个坐标系统是有效的,因为它有一个中心原点和规模类似于操纵杆输出和驱动输入。

\[A_ {x,y} = \ left(P_ {x,y}-\ frac {\ textit {resolution} _ {x,y}} {2} \ right)/ \ frac {\ textit {resolution} _ {x ,y}} {2}\]
Two images one of a pixel based axis and another from -1 to 1 that can be directly used with motors for aiming.

视场

您可以使用已知常数和目标在坐标平面上的位置来确定距目标的距离,偏航和俯仰。但是,为了计算这些,您必须确定您的FOV(视场)。为了凭经验确定垂直视场,请将相机设置为与平面保持一定距离,然后测量最顶部和最底部像素行之间的距离。

\[\frac{1}{2}FOV_{vertical}=tan\left(\frac{\frac{1}{2}distance_{y}}{distance_{z}}\right)\]

您可以使用相同的方法,但使用像素的第一列和最后一列之间的距离来找到水平FOV。

俯仰和偏航

一旦知道了视野和目标在瞄准坐标系中的位置,就可以轻松找到目标相对于机器人的俯仰和偏航。

\[pitch = \ frac {A_y} {2} FOV_ {vertical}\]
\[yaw=\frac{A_x}{2}FOV_{horizontal}\]

距离

如果目标的高度与机器人的高度明显不同,则可以使用已知的常数,例如目标和摄像机的物理高度以及摄像机的安装角度,来计算摄像机与目标之间的距离。

\[distance=\frac{height_{target}-height_{camera}}{tan(angle_{camera}+pitch)}\]

另一种选择是创建一个面积到距离的查找表,或估算面积和距离的反变常数( inverse variation constant )。但是,此方法不太准确。

备注

为了获得上述估计角度和距离的方法的最佳结果,您可以使用OpenCV校准相机,并使用校准矩阵重新投影目标像素。这样能够消除可能影响精度的任何失真。