edu.wpi.cscore.RawCVMatSink.java Source code

Java tutorial

Introduction

Here is the source code for edu.wpi.cscore.RawCVMatSink.java

Source

/*----------------------------------------------------------------------------*/
/* 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;
    }
}