2019-09-15 15:03:44 -04:00
|
|
|
package com.chameleonvision.vision.process;
|
2019-09-14 17:14:49 +03:00
|
|
|
|
2019-09-19 14:07:42 -04:00
|
|
|
import com.chameleonvision.vision.camera.Camera;
|
2019-09-21 13:30:09 -04:00
|
|
|
import org.opencv.core.CvType;
|
|
|
|
|
import org.opencv.core.Mat;
|
2019-09-16 04:08:23 -04:00
|
|
|
|
|
|
|
|
public class CameraProcess implements Runnable {
|
2019-09-19 14:07:42 -04:00
|
|
|
|
2019-09-22 02:49:30 -04: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;
|
|
|
|
|
|
|
|
|
|
CameraProcess(Camera camera) {
|
|
|
|
|
this.camera = camera;
|
|
|
|
|
maxFPS = camera.getVideoMode().fps;
|
2019-09-21 13:30:09 -04:00
|
|
|
var camVals = camera.getCamVals();
|
|
|
|
|
inputFrame = new Mat(camVals.ImageWidth, camVals.ImageHeight, CvType.CV_8UC3);
|
|
|
|
|
outputFrame = new Mat(camVals.ImageWidth, camVals.ImageHeight, CvType.CV_8UC3);
|
2019-09-22 02:49:30 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateFrameSize() {
|
|
|
|
|
var camVals = camera.getCamVals();
|
|
|
|
|
synchronized (inputFrameLock) {
|
|
|
|
|
inputFrame = new Mat(camVals.ImageWidth, camVals.ImageHeight, CvType.CV_8UC3);
|
|
|
|
|
}
|
|
|
|
|
synchronized (outputFrameLock) {
|
|
|
|
|
outputFrame = new Mat(camVals.ImageWidth, camVals.ImageHeight, CvType.CV_8UC3);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void updateFrame(Mat inputFrame) {
|
2019-09-22 13:35:19 -04:00
|
|
|
synchronized (inputFrameLock) {
|
2019-09-22 02:49:30 -04:00
|
|
|
inputFrame.copyTo(this.inputFrame);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
long getLatestFrame(Mat outputFrame) {
|
|
|
|
|
synchronized (outputFrameLock) {
|
|
|
|
|
this.outputFrame.copyTo(outputFrame);
|
|
|
|
|
return timestamp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
while (!Thread.interrupted()) {
|
|
|
|
|
synchronized (outputFrameLock) {
|
|
|
|
|
timestamp = camera.grabFrame(outputFrame);
|
|
|
|
|
}
|
|
|
|
|
synchronized (inputFrameLock) {
|
|
|
|
|
camera.putFrame(inputFrame);
|
|
|
|
|
}
|
|
|
|
|
var msToWait = (long) 1000 / maxFPS;
|
|
|
|
|
try {
|
|
|
|
|
Thread.sleep(msToWait);
|
|
|
|
|
} catch (InterruptedException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-09-14 17:14:49 +03:00
|
|
|
}
|