You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
2.8 KiB
Java

package gab.opencv;
import processing.core.*;
import java.awt.Rectangle;
import org.opencv.video.Video;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Core;
import org.opencv.core.Scalar;
public class Flow {
private Mat prev;
private Mat flow;
private boolean hasFlow = false;
private double pyramidScale = 0.5;
private int nLevels = 4;
private int windowSize = 8;
private int nIterations = 2;
private int polyN = 7;
private double polySigma = 1.5;
private int runningFlags = Video.OPTFLOW_FARNEBACK_GAUSSIAN;
private PApplet parent;
public Flow(PApplet parent) {
flow = new Mat();
this.parent = parent;
}
public int width(){
return flow.width();
}
public int height(){
return flow.height();
}
public boolean hasFlow(){
return hasFlow;
}
public void calculateOpticalFlow(Mat m) {
int flags = runningFlags;
if (!hasFlow) {
prev = m.clone();
flags = Video.OPTFLOW_USE_INITIAL_FLOW;
hasFlow = true;
}
Video.calcOpticalFlowFarneback(prev, m, flow, pyramidScale, nLevels, windowSize, nIterations, polyN, polySigma, flags);
prev = m.clone();
}
public PVector getTotalFlowInRegion(int x, int y, int w, int h) {
Mat region = flow.submat(y, y+h, x, x+w);
Scalar total = Core.sumElems(region);
return new PVector((float)total.val[0], (float)total.val[1]);
}
public PVector getAverageFlowInRegion(int x, int y, int w, int h) {
PVector total = getTotalFlowInRegion(x, y, w, h);
return new PVector(total.x/(flow.width() * flow.height()), total.y/(flow.width()*flow.height()));
}
public PVector getTotalFlow() {
return getTotalFlowInRegion(0, 0, flow.width(), flow.height());
}
public PVector getAverageFlow() {
return getAverageFlowInRegion(0, 0, flow.width(), flow.height());
}
public PVector getFlowAt(int x, int y){
return new PVector((float)flow.get(y, x)[0], (float)flow.get(y, x)[1]);
}
public void draw() {
int stepSize = 4;
for (int y = 0; y < flow.height(); y+=stepSize) {
for (int x = 0; x < flow.width(); x+=stepSize) {
PVector flowVec = getFlowAt(x,y);
parent.line(x, y, x+flowVec.x, y+flowVec.y);
}
}
}
public void setPyramidScale(double v){
pyramidScale = v;
}
public double getPyramidScale(){
return pyramidScale;
}
public void setLevels(int n){
nLevels = n;
}
public int getLevels(){
return nLevels;
}
public void setWindowSize(int s){
windowSize = s;
}
public int getWindowSize(){
return windowSize;
}
public void setIterations(int i){
nIterations = i;
}
public int getIterations(){
return nIterations;
}
public void setPolyN(int n){
polyN = n;
}
public int getPolyN(){
return polyN;
}
public void setPolySigma(double s){
polySigma = s;
}
public double getPolySigma(){
return polySigma;
}
}