mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
Also update copyright to include "and other WPILib contributors" and clarify license referral language to not be restricted to FIRST teams.
94 lines
2.7 KiB
Java
94 lines
2.7 KiB
Java
// Copyright (c) FIRST and other WPILib contributors.
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
// the WPILib BSD license file in the root directory of this 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;
|
|
}
|
|
}
|