Uso de CameraServer en roboRIO

Programa simple de CameraServer

El siguiente programa inicia la captura automática de una cámara USB como la Microsoft LifeCam que está conectada al roboRIO. En este modo, la cámara capturará fotogramas y los enviará al dashboard. Para ver las imágenes, cree un widget CameraServer Stream Viewer usando el menú «View», luego «Add» en el dashboard. Las imágenes no están procesadas y simplemente se envían desde la cámara al dashboard.

By going to View then "Add..." then "CameraServer Stream Viewer" SmartDashboard adds a stream viewer widget.
package org.usfirst.frc.team190.robot;

import edu.wpi.first.cameraserver.CameraServer;
import edu.wpi.first.wpilibj.IterativeRobot;

public class Robot extends IterativeRobot {

  public void robotInit() {
    CameraServer.getInstance().startAutomaticCapture();
  }
}

Programa de servidor de cámara avanzado

En el siguiente ejemplo, un hilo creado en robotInit() obtiene la instancia de Camera Server. Cada cuadro del video se procesa individualmente, en este caso, se convierte una imagen en color (BGR) a escala de grises utilizando el método OpenCV cvtColor(). Las imágenes resultantes luego se pasan al flujo de salida y se envían al dashboard. Puede reemplazar la operación cvtColor con cualquier código de procesamiento de imágenes que sea necesario para su aplicación. Incluso puede anotar la imagen utilizando métodos OpenCV para escribir información de orientación en la imagen que se envía al dashboard.

package org.usfirst.frc.team190.robot;

import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import edu.wpi.cscore.CvSink;
import edu.wpi.cscore.CvSource;
import edu.wpi.cscore.UsbCamera;
import edu.wpi.first.cameraserver.CameraServer;
import edu.wpi.first.wpilibj.IterativeRobot;

public class Robot extends IterativeRobot {

  public void robotInit() {
    new Thread(() -> {
      UsbCamera camera = CameraServer.getInstance().startAutomaticCapture();
      camera.setResolution(640, 480);

      CvSink cvSink = CameraServer.getInstance().getVideo();
      CvSource outputStream = CameraServer.getInstance().putVideo("Blur", 640, 480);

      Mat source = new Mat();
      Mat output = new Mat();

      while(!Thread.interrupted()) {
        if (cvSink.grabFrame(source) == 0) {
          continue;
        }
        Imgproc.cvtColor(source, output, Imgproc.COLOR_BGR2GRAY);
        outputStream.putFrame(output);
      }
    }).start();
  }
}

Observe que en estos ejemplos, el método PutVideo() escribe el video en una secuencia con nombre. Para ver esa transmisión en Shuffleboard, seleccione esa transmisión con nombre. En este caso, es «Blur» para el programa Java y «Gray» para el ejemplo de C ++.