RoboRIO’da CameraServer’ı kullanma

Basit CameraServer Programı

Aşağıdaki program, roboRIO’ya bağlı Microsoft LifeCam gibi bir USB kameranın otomatik çekimini başlatır. Bu modda kamera, kareleri çekecek ve bunları dashboard’a gönderecektir. Görüntüleri görüntülemek için, dashboard’daki “View-Görünüm” ve ardından “Add-Ekle” menüsünü kullanarak bir CameraServer Stream Viewer widget’ı oluşturun. Görüntüler işlenmemiştir ve sadece kameradan dashboard’a iletilir.

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();
  }
}

Gelişmiş Camera Server Programı

Aşağıdaki örnekte robotInit()’te oluşturulan bir iş parçası, Camera Server örneğini alır. Videonun her karesi ayrı ayrı işlenir, bu durumda OpenCV cvtColor() yöntemi kullanılarak bir renkli görüntü (BGR) gri ölçeğe dönüştürülür. Ortaya çıkan görüntüler daha sonra çıktı akışına aktarılır ve dashboard’a gönderilir. cvtColor işlemini, uygulamanız için gerekli olan herhangi bir görüntü işleme koduyla değiştirebilirsiniz. Dashboard’a gönderilen görüntüye hedef bilgisi yazmak için OpenCV yöntemlerini kullanarak görüntüye açıklama bile ekleyebilirsiniz.

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();
  }
}

Bu örneklerde, PutVideo() yönteminin videoyu adlandırılmış bir akışa yazdığına dikkat edin. Shuffleboard’da bu akışı görüntülemek için o adlandırılmış akışı seçin. Bu durumda, bu Java programı için “Blur” ve C++ örneği için “Gray”dir.