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
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;
|
|
}
|
|
} |