2017视觉程序示例

LabVIEW

其他LabVIEW范例随附2017 LabVIEW Vision范例。在启动屏幕上,单击支持->查找FRC | reg |。示例或在任何其他LabVIEW窗口中,单击帮助->查找示例,然后找到Vision文件夹以查找2017 Vision示例。示例图像与示例捆绑在一起。

C++/Java

我们提供打包成ZIP文件的一个GRIP项目,其中包括项目描述以及示例图像。可以在TeamForge <https://usfirst.collab.net/sf/frs/do/viewRelease/projects.wpilib/frs.sample_programs.2017_c_java_vision_sample>中找到ZIP文件。

参见:ref: ‘docs/software/vision-processing/grip/ use -generated-code in-a- Robot - Program:Using Generated Code in a Robot - Program ‘,了解如何在机器人程序中整合GRIP生成代码的详细信息。

内置的GRIP项目生成的代码将使用OpenCV在图像中找到绿色物体的轮廓,就如此ZIP的Vision images文件夹中所包含的图像那样。之后,您可能希望进一步处理这些轮廓,以评估它们是否是目标。为此:

  1. 使用boundingRect方法在边缘轮廓周围绘制外接矩形

  2. LabVIEW示例代码为此目标计算5个单独的比率。每个比率名义上应该等于1.0。为此,它按大小对轮廓进行排序,然后从最大的开始,对每一对可能是目标的轮廓进行值计算,并在找到目标或返回它找到的最佳对时停止。

下面公式中,每个字母代表外接矩形的一个指标(H =高,L=左,T=上,B=下,W=宽),数字下标为等高值(1为最大轮廓,2为第二大轮廓,以此类推)。

  • 最大高度应占总高度的40%(4英寸/ 10英寸):

\[\textit{Group Height} = \frac{H_1}{0.4 (B_2 - T_1)}\]
  • 底部边顶部至顶部边顶部应为总高度的60%(6 英寸/10 英寸):

\[\textit{dTop} = \frac{T_2 - T_1}{0.6 (B_2 - T_1)}\]
  • 轮廓1左缘到轮廓2左缘的距离相对于第一个轮廓的宽度应较小;然后我们加1以使比值达到1:

\[\textit{LEdge} = \frac{L_1 - L_2}{W_1} + 1\]
  • 两个轮廓的宽度应大致相同:

\[\textit{Width ratio} = \frac{W_1}{W_2}\]
  • 较大的边应该是较小边的两倍高

\[\textit{Height ratio} = \frac{H_1}{2 H_2}\]

然后通过计算,将每个比率转化为0-100分:

\[100 - (100 \cdot \mathrm{abs}(1 - \textit{Val}))\]
  1. 测量顶部外接矩形的顶部到底部外接矩形的底部的像素长度,来确定距离:

\[\textit{distance} = \frac{\textit{Target height in ft.} (10/12) \cdot \textit{YRes}}{2 \cdot \textit{PixelHeight} \cdot \tan (\textit{viewAngle of camera})}\]

LabVIEW的例子使用了高度来确定距离,因为圆形目标的边缘在检测中最容易产生噪声(因为角度点离摄像机越远,颜色看起来越不显绿)。这样做的缺点是,图像中目标的像素高度会受到相机角度的透视失真的影响。可能的方法包括:

  • 尝试使用宽度来代替

  • 实地测量物体在不同距离时的高度,并创建一个查阅表或回归方程

  • 安装相机到一个伺服电机上,使目标在垂直方向上置中,并使用伺服电机的角度计算距离(你将不得不靠自己或者找数学老师帮助解决合适的三角问题!)

  • 使用OpenCV校正透视失真。要做到这一点,你需要用OpenCV<https://docs.opencv.org/3.4.6/d4/d94/tutorial_camera_calibration.html>`来校准你的相机。这将生成一个变形矩阵和相机矩阵。您将使用这两个矩阵和undistortPoints方法来将您想要测量的点映射到“实际的”坐标(这比未失真的整个图像要少很多CPU消耗)