Files
PhotonVision/Main/src/main/java/com/chameleonvision/vision/process/USBCameraProcess.java
Matt cc2c065dc8 Rename USBCamera to USBCameraProcess & abstractify
- Most classes now take a CameraProcess instead of a USBCameraProcess
2019-11-07 09:10:09 -08:00

145 lines
4.0 KiB
Java

package com.chameleonvision.vision.process;
import com.chameleonvision.vision.Pipeline;
import com.chameleonvision.vision.camera.CamVideoMode;
import com.chameleonvision.vision.camera.CameraValues;
import com.chameleonvision.vision.camera.USBCamera;
import com.chameleonvision.vision.camera.StreamDivisor;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import java.util.List;
public class USBCameraProcess implements CameraProcess {
private final USBCamera usbCamera;
private final int maxFPS;
private final Object inputFrameLock = new Object();
private final Object outputFrameLock = new Object();
private Mat inputFrame;
private Mat outputFrame;
private long timestamp;
private StreamDivisor divisor;
public USBCameraProcess(USBCamera usbCamera) {
this.usbCamera = usbCamera;
maxFPS = usbCamera.getVideoMode().fps;
updateFrameSize();
}
public void updateFrameSize() {
var camVals = usbCamera.getCamVals();
divisor = usbCamera.getStreamDivisor();
var newWidth = camVals.ImageWidth / divisor.value;
var newHeight = camVals.ImageHeight / divisor.value;
synchronized (inputFrameLock) {
inputFrame = new Mat(newWidth, newHeight, CvType.CV_8UC3);
}
synchronized (outputFrameLock) {
outputFrame = new Mat(newWidth, newHeight, CvType.CV_8UC3);
}
}
public void updateFrame(Mat inputFrame) {
synchronized (inputFrameLock) {
inputFrame.copyTo(this.inputFrame);
}
}
public long getLatestFrame(Mat outputFrame) {
synchronized (outputFrameLock) {
this.outputFrame.copyTo(outputFrame);
return timestamp;
}
}
@Override
public void run() {
while (!Thread.interrupted()) {
synchronized (outputFrameLock) {
timestamp = usbCamera.grabFrame(outputFrame);
}
synchronized (inputFrameLock) {
if (divisor.value != 1) {
var camVals = usbCamera.getCamVals();
var newWidth = camVals.ImageWidth / divisor.value;
var newHeight = camVals.ImageHeight / divisor.value;
Size newSize = new Size(newWidth, newHeight);
Imgproc.resize(inputFrame, inputFrame, newSize);
}
usbCamera.putFrame(inputFrame);
}
var msToWait = (long) 1000 / maxFPS;
try {
Thread.sleep(msToWait);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// USBCameraProcess stuff
@Override
public String getCamName() {
return usbCamera.name;
}
@Override
public CameraValues getCamVals() {
return usbCamera.getCamVals();
}
@Override
public boolean getDriverMode() {
return usbCamera.getDriverMode();
}
@Override
public void setDriverMode(boolean isDriverMode) {
usbCamera.setDriverMode(isDriverMode);
}
@Override
public List<Pipeline> getPipelines() {
return usbCamera.getPipelines();
}
@Override
public Pipeline getCurrentPipeline() {
return usbCamera.getCurrentPipeline();
}
@Override
public int getCurrentPipelineIndex() {
return usbCamera.getCurrentPipelineIndex();
}
@Override
public void setExposure(int exposure) {
usbCamera.setExposure(exposure);
}
@Override
public void setBrightness(int brightness) {
usbCamera.setBrightness(brightness);
}
@Override
public CamVideoMode getVideoMode() {
return usbCamera.getVideoMode();
}
@Override
public String getNickname() {
return usbCamera.getNickname();
}
@Override
public void setCurrentPipelineIndex(int wantedIndex) {
usbCamera.setCurrentPipelineIndex(wantedIndex);
}
}