Ejemplos de visión 2017

LabVIEW

El ejemplo de Visión de 2017 de LabVIEW se incluye con los demás ejemplos de LabVIEW. Desde la pantalla de inicio, haga clic en Support->Find FRC® Examples o desde cualquier otra ventana de LabVIEW, haga clic en Help->Find Examples y localice la carpeta Vision para encontrar el ejemplo de Visión 2017. Las imágenes se incluyen con el ejemplo.

C++/Java

Hemos proporcionado un proyecto GRIP y la descripción a continuación, así como las imágenes de ejemplo, incluido en un ZIP que pueden ser encontrado en TeamForge <https://usfirst.collab.net/sf/frs/do/viewRelease/projects.wpilib/frs.sample_programs.2017_c_java_vision_sample>`_.

Consulte docs/software/vision-processing/grip/using-generated-code-in-a-robot-program:Using Generated Code in a Robot Program para obtener detalles sobre la integración de GRIP código generado en su programa de robot.

El código generado por el proyecto GRIP incluido encontrará contornos de OpenCV para partículas verdes en imágenes como las incluidas en la carpeta Vision Images de este ZIP. Desde allí es posible que usted desee seguir procesando estos contornos para evaluar si son el objetivo. Para hacer esto:

  1. Use el método boundingRect para dibujar rectángulos delimitadores alrededor de los contornos

  2. El código de ejemplo de LabVIEW calcula 5 proporciones separadas para el objetivo. Cada una de estas proporciones deberían ser nominalmente iguales a 1.0. Para hacer esto, ordene los contornos por tamaño, luego comience con el más grande, calcule estos valores para cada posible par de contornos que pueden ser el objetivo, y se detiene si encuentra un objetivo o devuelve el mejor par que encontró.

En las fórmulas a continuación, cada letra se refiere a una coordenada del límite delimitador (H = Altura, L = Izquierda, T = Arriba, B = Abajo, W = Ancho) y el subíndice numérico se refiere al número del contorno (1 es el contorno más grande, 2 es el segundo más grande, etc).

  • La altura superior debe ser del 40% de la altura total (4 in / 10 in):

\[\textit{Group Height} = \frac{H_1}{0.4 (B_2 - T_1)}\]
  • La parte superior de la franja inferior a la parte superior de la franja superior debe ser el 60% de la altura total (6 in / 10 in):

\[\textit{dTop} = \frac{T_2 - T_1}{0.6 (B_2 - T_1)}\]
  • La distancia entre el borde izquierdo del contorno 1 y el borde izquierdo del contorno 2 debe ser pequeño en relación con el ancho del primer contorno; luego agregamos 1 para hacer la relación centrada en 1:

\[\textit{LEdge} = \frac{L_1 - L_2}{W_1} + 1\]
  • El ancho de ambos contornos debe ser aproximadamente el mismo:

\[\textit{Width ratio} = \frac{W_1}{W_2}\]
  • La franja más grande debe ser dos veces más alta que la más pequeña.

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

Cada una de estas proporciones se convierte en una puntuación de 0-100 calculando:

\[100 - (100 \cdot \mathrm{abs}(1 - \textit{Val}))\]
  1. Para determinar la distancia, mida los píxeles desde la parte superior del cuadro delimitador superior hasta la parte inferior cuadro delimitador:

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

El ejemplo de LabVIEW usa la altura ya que los bordes del objetivo redondo son los más propensos a ruido en la detección (a medida que el ángulo apunta más lejos de la cámara, el color se ve menos verde). La desventaja de esto es que la altura del píxel del objetivo en la imagen se ve afectada por la perspectiva distorsión desde el ángulo de la cámara. Las posibles soluciones incluyen:

  • Try using width instead

  • Medir empíricamente la altura a varias distancias y cree una tabla de búsqueda o función de regresión

  • Montar la cámara en un servo, centre el objetivo verticalmente en la imagen y use el servo ángulo para el cálculo de la distancia (¡tendrá que calcular usted mismo el trigonometraje adecuado o encontrar un profesor de matemáticas para ayudar!)

  • Corregir la distorsión de perspectiva utilizando OpenCV. Para hacer esto necesitarás calibrar tu cámara con OpenCV <https://docs.opencv.org/3.4.6/d4/d94/tutorial_camera_calibration.html>_. Esto dará como resultado una matriz de distorsión y una matriz de cámara. Usted tomará estas dos matrices y las usará con la función undistortPoints para asignar los puntos que desea medir para el cálculo de la distancia a las coordenadas «correctas» (esto es mucho menos intensivo de CPU que distorsionar toda la imagen)