diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java new file mode 100644 index 0000000000000000000000000000000000000000..7ff5a30f367498dd395c6a113b805b4fb8a86a4b --- /dev/null +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java @@ -0,0 +1,121 @@ +package uy.edu.fing.chesstrack.modulovision.imgproc; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Vector; + +import org.opencv.core.Core; +import org.opencv.core.CvType; +import org.opencv.core.Mat; +import org.opencv.core.MatOfPoint; +import org.opencv.core.Point; +import org.opencv.core.Rect; +import org.opencv.core.Scalar; +import org.opencv.core.Size; +import org.opencv.video.BackgroundSubtractorMOG; +import org.opencv.video.BackgroundSubtractorMOG2; +import org.opencv.imgproc.*; + +import android.graphics.SumPathEffect; +import android.media.AudioManager; +import android.media.ToneGenerator; +import android.util.Log; + + +public class BackgroundSupress implements ImgProcInterface { + + private static final String TAG = "CHESSTRACK::BackgroundSupress"; + private final Mat fgMaskMOG; + private final Mat fgMaskMOG2; + private final Mat morphKernel; + private final BackgroundSubtractorMOG pMOG; + private final BackgroundSubtractorMOG2 pMOG2; + private final List<MatOfPoint> contours; + + public BackgroundSupress() { + super(); + morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3)); + fgMaskMOG = new Mat(4,1,CvType.CV_8UC1); + fgMaskMOG2 = new Mat(4,1,CvType.CV_8UC1); + pMOG = new BackgroundSubtractorMOG(); //MOG approach + pMOG2 = new BackgroundSubtractorMOG2(); //MOG approach + Log.i(TAG, "at background supress constructor"); + contours = new ArrayList<MatOfPoint>(); + } + + @Override + public Mat procesarImagen(Mat inputFrame) { + Log.i(TAG, "BackgroundS "); + + Mat copy = new Mat(inputFrame.size(),CvType.CV_8UC3); + inputFrame.convertTo(copy, CvType.CV_8UC3); + Imgproc.cvtColor(inputFrame, copy, Imgproc.COLOR_BGRA2BGR); + + pMOG.apply(copy, fgMaskMOG); + pMOG2.apply(copy, fgMaskMOG2,0); + Log.i(TAG, "Apply pMOG"); + + Imgproc.erode(fgMaskMOG2, fgMaskMOG2, morphKernel); + Log.i(TAG, "Apply erode"); + + Imgproc.threshold(fgMaskMOG2, fgMaskMOG2, 200, 255, Imgproc.THRESH_BINARY); + Log.i(TAG, "Apply threshold"); + + Imgproc.dilate(fgMaskMOG2, fgMaskMOG2, morphKernel); + Log.i(TAG, "Apply dilate"); + + Scalar suma = Core.sumElems(fgMaskMOG2); + Log.i(TAG, "SUMA = " + suma); + + /*double maxArea = 0; + MatOfPoint largestContour = null; + Imgproc.findContours(fgMaskMOG2, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_TC89_L1); + for (MatOfPoint contour : contours) { + double area = Imgproc.contourArea(contour); + if (area > maxArea) { + maxArea = area; + largestContour = contour; + } + } + Log.i(TAG, "ESTABLE !!!" + maxArea); + if ((largestContour != null) && (maxArea > 10000)){ + Log.i(TAG, "MANO !!!" + maxArea); + Rect boundingRect = Imgproc.boundingRect(largestContour); + ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); + toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms + }*/ + + if (suma.val[0] > 100000){ + Log.i(TAG, "MANO !!!"); + Core.putText(fgMaskMOG2, "MANO !!!", new Point(50, 50),Core.FONT_HERSHEY_SIMPLEX, 0.8 , new Scalar(255,255,0)); +// ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); +// toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms + } else { + Log.i(TAG, "ESTABLE !!!"); + Core.putText(fgMaskMOG2, "ESTABLE !!!", new Point(50, 50),Core.FONT_HERSHEY_SIMPLEX, 0.5 , new Scalar(255,255,0)); + } + + /*Imgproc.findContours(fgMaskMOG2, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE); + + for(int idx = 0; idx < contours.size(); idx++) + { + double area = Imgproc.contourArea(contours.get(idx)); + Log.i(TAG, "CONTOUR = AREA: " + area); + if ((area > 15000) && (area < 70000)){ + Log.i(TAG, "DRAW !!! : " + area); + Scalar color = new Scalar(255,127,127); + Rect r = Imgproc.boundingRect(contours.get(idx)); + Log.i(TAG, "3 at backgroundS "+(fgMaskMOG2.type() == CvType.CV_8UC1)); + Core.rectangle(fgMaskMOG2, r.tl(), r.br(), color, 2, 8, 0); + //Imgproc.drawContours(fgMaskMOG2, contours, idx, color); + } + } + + contours.clear();*/ + Log.i(TAG, "END Background Sss"); + return fgMaskMOG2; + } + +} +