Files
PhotonVision/Main/src/main/java/com/chameleonvision/vision/process/CameraProcess.java

78 lines
2.4 KiB
Java
Raw Normal View History

package com.chameleonvision.vision.process;
2019-09-19 14:07:42 -04:00
import com.chameleonvision.vision.camera.Camera;
2019-11-02 03:35:12 -04:00
import com.chameleonvision.vision.camera.StreamDivisor;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
2019-11-02 03:35:12 -04:00
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
public class CameraProcess implements Runnable {
2019-09-19 14:07:42 -04:00
2019-10-20 10:13:07 +03:00
private final Camera camera;
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;
2019-11-02 03:35:12 -04:00
private StreamDivisor divisor;
2019-09-22 02:49:30 -04:00
2019-10-20 10:13:07 +03:00
CameraProcess(Camera camera) {
this.camera = camera;
maxFPS = camera.getVideoMode().fps;
2019-11-02 03:35:12 -04:00
updateFrameSize();
2019-10-20 10:13:07 +03:00
}
2019-09-22 02:49:30 -04:00
2019-11-02 03:35:12 -04:00
public void updateFrameSize() {
2019-10-20 10:13:07 +03:00
var camVals = camera.getCamVals();
2019-11-02 03:35:12 -04:00
divisor = camera.getStreamDivisor();
var newWidth = camVals.ImageWidth / divisor.value;
var newHeight = camVals.ImageHeight / divisor.value;
2019-10-20 10:13:07 +03:00
synchronized (inputFrameLock) {
2019-11-02 03:35:12 -04:00
inputFrame = new Mat(newWidth, newHeight, CvType.CV_8UC3);
2019-10-20 10:13:07 +03:00
}
synchronized (outputFrameLock) {
2019-11-02 03:35:12 -04:00
outputFrame = new Mat(newWidth, newHeight, CvType.CV_8UC3);
2019-10-20 10:13:07 +03:00
}
}
2019-09-22 02:49:30 -04:00
2019-10-20 10:13:07 +03:00
void updateFrame(Mat inputFrame) {
synchronized (inputFrameLock) {
inputFrame.copyTo(this.inputFrame);
}
}
2019-09-22 02:49:30 -04:00
2019-10-20 10:13:07 +03:00
long getLatestFrame(Mat outputFrame) {
synchronized (outputFrameLock) {
this.outputFrame.copyTo(outputFrame);
return timestamp;
}
}
2019-09-22 02:49:30 -04:00
2019-10-20 10:13:07 +03:00
@Override
public void run() {
while (!Thread.interrupted()) {
synchronized (outputFrameLock) {
timestamp = camera.grabFrame(outputFrame);
}
synchronized (inputFrameLock) {
2019-11-02 03:35:12 -04:00
if (divisor.value != 1) {
var camVals = camera.getCamVals();
var newWidth = camVals.ImageWidth / divisor.value;
var newHeight = camVals.ImageHeight / divisor.value;
Size newSize = new Size(newWidth, newHeight);
Imgproc.resize(inputFrame, inputFrame, newSize);
}
2019-10-20 10:13:07 +03:00
camera.putFrame(inputFrame);
}
var msToWait = (long) 1000 / maxFPS;
try {
Thread.sleep(msToWait);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}