74 lines
2.4 KiB
Java
74 lines
2.4 KiB
Java
import java.awt.image.BufferedImage;
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
|
|
import javax.imageio.ImageIO;
|
|
|
|
import org.opencv.core.CvType;
|
|
import org.opencv.core.Mat;
|
|
import org.opencv.core.MatOfByte;
|
|
import org.opencv.core.Rect2d;
|
|
import org.opencv.imgcodecs.Imgcodecs;
|
|
import org.opencv.tracking.Tracker;
|
|
import org.opencv.tracking.TrackerBoosting;
|
|
|
|
public class ObjectTracker {
|
|
|
|
Tracker objectTracker;
|
|
private int numberOfFramesLostFor;
|
|
|
|
public ObjectTracker(BufferedImage image, Rect2d boundingBox) throws IOException {
|
|
this.objectTracker = TrackerBoosting.create();
|
|
this.objectTracker.init(BufferedImage2Mat(image), boundingBox);
|
|
this.numberOfFramesLostFor = 0;
|
|
}
|
|
|
|
public ObjectTracker(Mat image, Rect2d boundingBox) {
|
|
this.objectTracker = TrackerBoosting.create();
|
|
this.objectTracker.init(image, boundingBox);
|
|
this.numberOfFramesLostFor = 0;
|
|
}
|
|
|
|
|
|
public boolean update(BufferedImage image, Rect2d boundingBox) throws IOException {
|
|
boolean trackingSuccessful = objectTracker.update(BufferedImage2Mat(image), boundingBox);
|
|
//System.out.print("Tracking: " + trackingSuccessful + ". Counter at ");
|
|
updateNumberOfFramesLostFor(trackingSuccessful);
|
|
return isObjectTrackingFailure();
|
|
}
|
|
|
|
public boolean update(Mat image, Rect2d boundingBox) {
|
|
boolean trackingSuccessful = objectTracker.update(image, boundingBox);
|
|
updateNumberOfFramesLostFor(trackingSuccessful);
|
|
return isObjectTrackingFailure();
|
|
}
|
|
|
|
private void updateNumberOfFramesLostFor(boolean trackingSuccessful) {
|
|
if (trackingSuccessful) {
|
|
numberOfFramesLostFor = 0;
|
|
}
|
|
else {
|
|
numberOfFramesLostFor++;
|
|
}
|
|
}
|
|
|
|
private boolean isObjectTrackingFailure() {
|
|
//System.out.println(numberOfFramesLostFor);
|
|
return numberOfFramesLostFor > 3;
|
|
}
|
|
|
|
/*private Mat bufferedImageToMat(BufferedImage sourceImage) {
|
|
Mat mat = new Mat(sourceImage.getHeight(), sourceImage.getWidth(), CvType.CV_8UC3);
|
|
byte[] data = ((DataBufferByte) sourceImage.getRaster().getDataBuffer()).getData();
|
|
mat.put(0, 0, data);
|
|
return mat;
|
|
}*/
|
|
|
|
private Mat BufferedImage2Mat(BufferedImage image) throws IOException {
|
|
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
|
ImageIO.write(image, "jpg", byteArrayOutputStream);
|
|
byteArrayOutputStream.flush();
|
|
return Imgcodecs.imdecode(new MatOfByte(byteArrayOutputStream.toByteArray()), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
|
|
}
|
|
}
|