package resa.evaluation.topology.tomVLD;

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_features2d;
import org.bytedeco.javacpp.opencv_nonfree;

/**
 * Created by Tom.fu on 29/4/2015.
 */
public class SIFTfeatures {

    opencv_features2d.KeyPoint keyPoints; //= new opencv_features2d.KeyPoint();
    opencv_core.Mat testDescriptors;// = new opencv_core.Mat();
    opencv_core.Mat rr;// = subFrame.clone();
    opencv_core.Rect roi;

    public SIFTfeatures(opencv_nonfree.SIFT sift, opencv_core.Mat frame, opencv_core.Rect rec, boolean isWholeFrame){

        keyPoints = new opencv_features2d.KeyPoint();
        testDescriptors = new opencv_core.Mat();
        roi = new opencv_core.Rect();
        roi.x(rec.x());
        roi.y(rec.y());
        roi.width(rec.width());
        roi.height(rec.height());

        if (isWholeFrame) {
            opencv_core.Mat r = new opencv_core.Mat(frame, roi);
            rr = r.clone(); // make r continuous
            r.release();
        }else {
            rr = frame.clone();//subframe
        }

        sift.detectAndCompute(rr, opencv_core.Mat.EMPTY, keyPoints, testDescriptors);
    }

    public void release(){
        // Manually force JVM to release this.
        rr.release();
        keyPoints.deallocate();
        testDescriptors.release();
    }
}
