diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java index 940c5f4a1fad9bb4bd30764f2c359bcebaaf906b..a1371cff1224ec92327af1575fa6332cf351d906 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java @@ -12,6 +12,7 @@ import uy.edu.fing.chesstrack.communication.Client; import uy.edu.fing.chesstrack.modulomodelador.Modelador; import uy.edu.fing.chesstrack.modulovision.Adquisicion; import uy.edu.fing.chesstrack.modulovision.Calibracion; +import uy.edu.fing.chesstrack.modulovision.imgproc.BackgroundSupress; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; @@ -24,50 +25,47 @@ import android.view.Menu; import android.view.MenuItem; import android.view.SurfaceView; import android.view.WindowManager; -import android.widget.Button; import android.widget.EditText; -public class ChessTrackActivity extends Activity implements -CvCameraViewListener { +public class ChessTrackActivity extends Activity implements CvCameraViewListener { private static final String TAG = "CHESSTRACK::Activity"; private static final String IPV4_REGEX = "^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$"; private static final String PORT_REGEX = "^(\\d{4,5})$"; - private static final String welcomeMSG = "" + private static final String WELCOME_MSG = "" + "--------------------------------------------------------------------------\n" + " .:: CHESSTRACK ::. seguimiento de una partida de Ajedrez\n" + "\n" - + " Aylen Ricca - Nicolas Furquez\n" + + " TImag 2014\n" + + " Nicolas Furquez - Aylen Ricca\n" + "--------------------------------------------------------------------------\n"; - private CameraBridgeViewBase mOpenCvCameraView; - // private JavaCameraView mOpenCvCameraView; - - private Adquisicion adq; - private Calibracion calibrar; - private Button btnCalibrar; - private Client ClientCommunication; - private MenuItem mItemCalibrar; - private MenuItem mItemServer; - // TODO es chancho pero ver luego - private Mat frame; - private boolean isUsed; - private boolean isCalibrada; - - private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback( - this) { + private CameraBridgeViewBase _mOpenCvCameraView; + // private JavaCameraView _mOpenCvCameraView; + + private Adquisicion _adquisicion; + private BackgroundSupress _analizador; + private Client _client; + private MenuItem _mItemCalibrar; + private MenuItem _mItemServer; + private Mat _frame; + private boolean _isUsed; + private boolean _isCalibrada; + + private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { + @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i(TAG, "OpenCV loaded successfully"); - mOpenCvCameraView.enableView(); + _mOpenCvCameraView.enableView(); } - break; + break; default: { super.onManagerConnected(status); } - break; + break; } } }; @@ -75,30 +73,24 @@ CvCameraViewListener { @Override public void onResume() { super.onResume(); - OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, - mLoaderCallback); + OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback); } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "called onCreate"); super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.chess_track_layout); - mOpenCvCameraView = (JavaCameraView) findViewById(R.id.chess_track_layout); - mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); - mOpenCvCameraView.setCvCameraViewListener(this); + _mOpenCvCameraView = (JavaCameraView) findViewById(R.id.chess_track_layout); + _mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); + _mOpenCvCameraView.setCvCameraViewListener(this); Modelador.getInstance(); - try { - isUsed = false; - isCalibrada = false; - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - // getServerIp(); + //_analizador = new BackgroundSupress(); + _isUsed = false; + _isCalibrada = false; } public void getServerIp() { @@ -113,7 +105,8 @@ CvCameraViewListener { @Override public void onClick(DialogInterface dialog, int whichButton) { Editable value = input.getText(); - if (value == null || value.toString().equals("") || !value.toString().matches(IPV4_REGEX)) { + if (value == null || value.toString().equals("") + || !value.toString().matches(IPV4_REGEX)) { Log.i(TAG, "INPUT= not valid IP" + value.toString()); getServerIp(); } else { @@ -125,13 +118,6 @@ CvCameraViewListener { } }); - /* - * alert.setNegativeButton("Cancel", new - * DialogInterface.OnClickListener() { public void - * onClick(DialogInterface dialog, int whichButton) { // no server - * communication -- FIXME do not send info to client } }); - */ - alert.show(); } @@ -157,9 +143,9 @@ CvCameraViewListener { int port = Integer.parseInt(value.toString()); Log.i(TAG, "PORT=" + port); - // ClientCommunication = Client.getInstance(); - // ClientCommunication.EstablishConnection(ip, port); - // ClientCommunication.SendData(welcomeMSG); + _client = Client.getInstance(); + _client.EstablishConnection(ip, port); + _client.SendData(WELCOME_MSG); } } }); @@ -170,40 +156,34 @@ CvCameraViewListener { @Override public boolean onCreateOptionsMenu(Menu menu) { Log.i(TAG, "called onCreateOptionsMenu"); - mItemCalibrar = menu.add("Calibrar.."); - mItemServer = menu.add("Conectar Server"); - + _mItemCalibrar = menu.add("Calibrar.."); + _mItemServer = menu.add("Conectar Server"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Log.i(TAG, "Menu Item selected " + item); - if (item == mItemCalibrar) { - isUsed = true; - if (frame != null) { - if (Calibracion.getInstance().calibrar(frame)) { - - ToneGenerator toneG = new ToneGenerator( - AudioManager.STREAM_ALARM, 50); - toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, - 200); // 200 is duration in ms + if (item == _mItemCalibrar) { + _isUsed = true; + if (_frame != null) { + if (Calibracion.getInstance().calibrar(_frame)) { + + ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); + toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,200); //ms try { - adq = new Adquisicion(); + this._adquisicion = new Adquisicion(); } catch (Exception e) { - // TODO Auto-generated catch block e.printStackTrace(); } - isCalibrada = true; + _isCalibrada = true; } else { - ToneGenerator toneG = new ToneGenerator( - AudioManager.STREAM_ALARM, 50); - toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, - 700); // 200 is duration in ms + ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); + toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,700); } } - isUsed = false; - }else if(item == mItemServer){ + _isUsed = false; + } else if (item == _mItemServer) { getServerIp(); } return true; @@ -212,19 +192,19 @@ CvCameraViewListener { @Override public void onPause() { super.onPause(); - if (mOpenCvCameraView != null) { - mOpenCvCameraView.disableView(); + if (_mOpenCvCameraView != null) { + _mOpenCvCameraView.disableView(); } } @Override public void onDestroy() { super.onDestroy(); - if (mOpenCvCameraView != null) { - mOpenCvCameraView.disableView(); + if (_mOpenCvCameraView != null) { + _mOpenCvCameraView.disableView(); } - if (this.ClientCommunication != null) { - this.ClientCommunication.Stop(); + if (this._client != null) { + this._client.Stop(); } } @@ -239,21 +219,20 @@ CvCameraViewListener { @Override public Mat onCameraFrame(Mat inputFrame) { // TODO MANEJAR ESTADOS - if (!isUsed) { - frame = inputFrame; + if (!_isUsed) { + _frame = inputFrame; // FIXME - para qe lo guardo ?? } - if (isCalibrada) { - - Log.i(TAG, "calibrada"); + if (_isCalibrada) { + Log.i(TAG, "new _frame - calibrada"); - inputFrame = adq.processFrame(inputFrame); - Modelador.getInstance().dividirTablero(inputFrame); - return Modelador.getInstance().dibujarEscaquesSobel(); - // return inputFrame; + inputFrame = _adquisicion.processFrame(inputFrame); + if (_estado == ESTABLE){ + //Modelador.getInstance().dividirTablero(inputFrame); + return Modelador.getInstance().dibujarEscaquesSobel(); + } + return inputFrame; } - return inputFrame; } - } diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java new file mode 100644 index 0000000000000000000000000000000000000000..b465c169f6083dcc27950d3339c9abea0e53d612 --- /dev/null +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java @@ -0,0 +1,28 @@ +package uy.edu.fing.chesstrack.modulovision; + +public class Manager { + + private static final String TAG = "MANAGER"; + private static Manager _instance; + private static int _estado; + + protected Manager() { + + } + + public static Manager getInstance() { + if (_instance == null) { + _instance = new Manager(); + } + return _instance; + } + + public static int get_estado() { + return _estado; + } + + public static void set_estado(int _estado) { + Manager._estado = _estado; + } + +} 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 index 697c72730d70804dde9c720ea56bbf23efec8ba2..b952e1e235db1991aec6461aeb10b9ea9b223ff2 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java @@ -1,10 +1,5 @@ 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; @@ -13,71 +8,109 @@ 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 uy.edu.fing.chesstrack.communication.Client; +import uy.edu.fing.chesstrack.ChessTrackActivity; +import uy.edu.fing.chesstrack.modulomodelador.Modelador; +import uy.edu.fing.chesstrack.modulovision.Calibracion; +import uy.edu.fing.chesstrack.modulovision.Manager; 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 static int e = 0; - private final Mat fgMaskMOG; - private Mat fgMaskMOG2; - private final Mat morphKernel; - private final BackgroundSubtractorMOG pMOG; - private BackgroundSubtractorMOG2 pMOG2; + private static final int OCLUSION = 1; + private static final int ESTABLE = 2; + private static final int TRANSICION = 0; + private static final int START = -1; + + private Mat _fgMaskMOG2; + private BackgroundSubtractorMOG2 _pMOG2; + private final Mat _morphKernel; + //private Client _communicator; + private int _estadoANTERIOR; + private int _estadoACTUAL; //private final List<MatOfPoint> contours; - private Client communicator; - private int estadoANTERIOR = 0; - private int estadoACTUAL = 0; 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>(); + Log.i(TAG, "constructor INI"); - communicator = Client.getInstance(); + _morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3)); + _fgMaskMOG2 = new Mat(4,1,CvType.CV_8UC1); + _pMOG2 = new BackgroundSubtractorMOG2(); + _estadoACTUAL = START; + _estadoANTERIOR = START; + //_communicator = Client.getInstance(); + //contours = new ArrayList<MatOfPoint>(); + + Log.i(TAG, "constructor FIN"); } @Override public Mat procesarImagen(Mat inputFrame) { - Log.i(TAG, "BackgroundS "); + Log.i(TAG, "procesar "); + + Mat ret = Mat.zeros(Calibracion.getInstance().getImagenCalibrada().size(), CvType.CV_8UC4); + Rect roi = Calibracion.getRectPOI(); + Log.i(TAG, "ROI" + roi.size()); + + Mat region = ret.submat(roi); + + Mat working = inputFrame.submat(roi); - Mat copy = new Mat(inputFrame.size(),CvType.CV_8UC3); - inputFrame.convertTo(copy, CvType.CV_8UC3); - Imgproc.cvtColor(inputFrame, copy, Imgproc.COLOR_BGRA2BGR); +// Mat copy = new Mat(submat.size(),CvType.CV_8UC3);; +// submat.convertTo(copy, CvType.CV_8UC3); - pMOG.apply(copy, fgMaskMOG); - pMOG2.apply(copy, fgMaskMOG2,0); - Log.i(TAG, "Apply pMOG"); + //Mat copy = new Mat(inputFrame.size(),CvType.CV_8UC3); + //inputFrame.convertTo(copy, CvType.CV_8UC3); + //Imgproc.cvtColor(inputFrame, copy, Imgproc.COLOR_BGRA2BGR); - Imgproc.erode(fgMaskMOG2, fgMaskMOG2, morphKernel); + _pMOG2.apply(working, _fgMaskMOG2); + Log.i(TAG, "Apply pMOG2" + _fgMaskMOG2.size()); + + Imgproc.erode(_fgMaskMOG2, _fgMaskMOG2, _morphKernel); Log.i(TAG, "Apply erode"); - Imgproc.threshold(fgMaskMOG2, fgMaskMOG2, 200, 255, Imgproc.THRESH_BINARY); + Imgproc.threshold(_fgMaskMOG2, _fgMaskMOG2, 200, 255, Imgproc.THRESH_BINARY); Log.i(TAG, "Apply threshold"); - //Imgproc.dilate(fgMaskMOG2, fgMaskMOG2, morphKernel); + //Imgproc.dilate(_fgMaskMOG2, _fgMaskMOG2, _morphKernel); //Log.i(TAG, "Apply dilate"); - Scalar suma = Core.sumElems(fgMaskMOG2); + Scalar suma = Core.sumElems(_fgMaskMOG2); Log.i(TAG, "SUMA = " + suma); + _estadoANTERIOR = _estadoACTUAL; + if (suma.val[0] > 1250000){ + Log.i(TAG, "MANO !!!"); + + _estadoACTUAL = OCLUSION; + //_communicator.SendData("OCLUSION\n"); + Core.putText(_fgMaskMOG2, "MANO !!!", new Point(20, 20),Core.FONT_HERSHEY_SIMPLEX, 0.8 , new Scalar(255,255,0)); + + } else { + Log.i(TAG, "ESTABLE !!!"); + if (_estadoANTERIOR == OCLUSION){ + Core.putText(_fgMaskMOG2, "TRANSI !!!", new Point(20, 20),Core.FONT_HERSHEY_SIMPLEX, 0.8 , new Scalar(255,255,0)); + _estadoACTUAL = TRANSICION; + } + if (_estadoANTERIOR == TRANSICION){ + Core.putText(_fgMaskMOG2, "ESTABLE !!!", new Point(20, 20),Core.FONT_HERSHEY_SIMPLEX, 0.8 , new Scalar(255,255,0)); + _estadoACTUAL = ESTABLE; + _pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach + Manager.set_estado(ESTABLE); + } + + //_communicator.SendData("ESTABLE\n"); + } + /*double maxArea = 0; MatOfPoint largestContour = null; - Imgproc.findContours(fgMaskMOG2, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_TC89_L1); + 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) { @@ -93,33 +126,7 @@ public class BackgroundSupress implements ImgProcInterface { toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms }*/ - if (suma.val[0] > 100000){ - estadoANTERIOR = estadoACTUAL; - estadoACTUAL = 1; - - Log.i(TAG, "MANO !!!"); - communicator.SendData("1\n"); - 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 { - estadoANTERIOR = estadoACTUAL; - if (estadoANTERIOR == 1){ - // estado transicion - - estadoACTUAL = 3; - } - if (estadoANTERIOR == 3){ - // estado estable - estadoACTUAL = 2; - pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach - } - Log.i(TAG, "ESTABLE !!!"); - communicator.SendData("0\n"); - 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); + /*Imgproc.findContours(_fgMaskMOG2, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE); for(int idx = 0; idx < contours.size(); idx++) { @@ -129,16 +136,17 @@ public class BackgroundSupress implements ImgProcInterface { 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); + 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; - } + Log.i(TAG, "END"); + Imgproc.cvtColor(_fgMaskMOG2, region, Imgproc.COLOR_GRAY2RGBA,4); + return ret; + } }