Java tutorial
/*----------------------------------------------------------------------------*/ /* Copyright (c) 2018-2019 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ package edu.wpi.cscore; import java.nio.ByteBuffer; import org.opencv.core.CvType; import org.opencv.core.Mat; import edu.wpi.cscore.VideoMode.PixelFormat; import edu.wpi.cscore.raw.RawFrame; public class RawCVMatSink extends ImageSink { RawFrame frame = new RawFrame(); Mat tmpMat; ByteBuffer origByteBuffer; int width; int height; int pixelFormat; int bgrValue = PixelFormat.kBGR.getValue(); private int getCVFormat(PixelFormat pixelFormat) { int type = 0; switch (pixelFormat) { case kYUYV: case kRGB565: type = CvType.CV_8UC2; break; case kBGR: type = CvType.CV_8UC3; break; case kGray: case kMJPEG: default: type = CvType.CV_8UC1; break; } return type; } /** * Create a sink for accepting OpenCV images. * WaitForFrame() must be called on the created sink to get each new * image. * * @param name Source name (arbitrary unique identifier) */ public RawCVMatSink(String name) { super(CameraServerJNI.createRawSink(name)); } /** * Wait for the next frame and get the image. * Times out (returning 0) after 0.225 seconds. * The provided image will have three 3-bit channels stored in BGR order. * * @return Frame time, or 0 on error (call GetError() to obtain the error * message) */ public long grabFrame(Mat image) { return grabFrame(image, 0.225); } /** * Wait for the next frame and get the image. * Times out (returning 0) after timeout seconds. * The provided image will have three 3-bit channels stored in BGR order. * * @return Frame time, or 0 on error (call GetError() to obtain the error * message); the frame time is in 1 us increments. */ public long grabFrame(Mat image, double timeout) { frame.setWidth(0); frame.setHeight(0); frame.setPixelFormat(bgrValue); long rv = CameraServerJNI.grabSinkFrameTimeout(m_handle, frame, timeout); if (rv <= 0) { return rv; } if (frame.getDataByteBuffer() != origByteBuffer || width != frame.getWidth() || height != frame.getHeight() || pixelFormat != frame.getPixelFormat()) { origByteBuffer = frame.getDataByteBuffer(); height = frame.getHeight(); width = frame.getWidth(); pixelFormat = frame.getPixelFormat(); tmpMat = new Mat(frame.getHeight(), frame.getWidth(), getCVFormat(VideoMode.getPixelFormatFromInt(pixelFormat)), origByteBuffer); } tmpMat.copyTo(image); return rv; } }