diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java index 2631d289e49dfa8e9d460e5994a7faa96caa949e..ca640a73f6da632d360aaf77c5596094f2abcd64 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java @@ -92,6 +92,7 @@ public class ChessTrackActivity extends Activity implements alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { + _manager.setConnection("192.168.1.101", 5555); //FIXME DELETE !!!! Editable value = input.getText(); if (value == null || value.toString().equals("") || !value.toString().matches(IPV4_REGEX)) { diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java index 4645609897eaa13110c1949ad4a0e0828bed87c4..7816c24c74072fe05a1f02522373a8612d522086 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java @@ -13,8 +13,8 @@ public class Client { private static Client _clientInstance; private Socket serverSocket; - private int _serverPort; - private String _serverIp; + private int _serverPort = 5556; + private String _serverIp = "192.168.1.101"; //private BufferedReader input; private DataOutputStream output; @@ -32,8 +32,8 @@ public class Client { public void EstablishConnection(String serverIp, int serverPort) { Log.i(TAG, "init client-server communication"); - this._serverIp = serverIp; - this._serverPort = serverPort; + //this._serverIp = serverIp; + //this._serverPort = serverPort; try { Log.i(TAG, "Server on " + this._serverIp + ":" + _serverPort); diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulomodelador/Modelador.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulomodelador/Modelador.java index 1a45bf4d6d57f1481066eb343c3dd1a43e648cfb..a21daf892926641fda9ee8ae9e45b8e7866610c0 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulomodelador/Modelador.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulomodelador/Modelador.java @@ -22,7 +22,7 @@ public class Modelador { //private static Modelador instance; - private Modelador(){ + public Modelador(){ tablero = Mat.zeros(new Size(8, 8), CvType.CV_8UC1); escaques = new Mat[CANT_FILAS][CANT_FILAS]; @@ -140,7 +140,7 @@ public class Modelador { if (cant_pix_white > (50) ){ Imgproc.cvtColor(mIntermediateMat, subm, Imgproc.COLOR_GRAY2RGBA,4); }else{ - escaques[i][j].copyTo(subm); + Imgproc.cvtColor(escaques[i][j], subm, Imgproc.COLOR_GRAY2RGBA,4); } } diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/DetectorOclusion.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/DetectorOclusion.java index 4467dc5b0d53965ed325815e5aaa639883d5e604..3caca7ea184076054147be583b15a122d7256ac6 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/DetectorOclusion.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/DetectorOclusion.java @@ -3,7 +3,6 @@ package uy.edu.fing.chesstrack.modulovision; import org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; -import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgproc.*; @@ -11,36 +10,35 @@ import org.opencv.video.BackgroundSubtractorMOG2; import android.util.Log; - public class DetectorOclusion { private static final String TAG = "CHESSTRACK::BackgroundSupress"; - private static final int OCLUSION = 1; - private static final int ESTABLE = 2; - private static final int TRANSICION = 0; + private static final int OCLUSION = 0; + private static final int ESTABLE = 1; + private static final int TRANSICION = 2; private static final int START = -1; private Mat _fgMaskMOG2; + private Mat _resultado; private BackgroundSubtractorMOG2 _pMOG2; private final Mat _morphKernel; private int _estadoANTERIOR; private int _estadoACTUAL; - //private final List<MatOfPoint> contours; public DetectorOclusion() { super(); Log.i(TAG, "constructor INI"); - - _morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3)); - _fgMaskMOG2 = new Mat(4,1,CvType.CV_8UC1); + + _morphKernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3, 3)); + _fgMaskMOG2 = new Mat(4, 1, CvType.CV_8UC1); _pMOG2 = new BackgroundSubtractorMOG2(); _estadoACTUAL = START; - //contours = new ArrayList<MatOfPoint>(); + _resultado = new Mat(); Log.i(TAG, "constructor FIN"); } - public Mat procesarImagen(Mat inputFrame) { + public boolean hayNuevoTableroValido(Mat inputFrame) { Log.i(TAG, "Procesar!"); Log.i(TAG, "Region SIZE=" + inputFrame.size()); @@ -49,76 +47,70 @@ public class DetectorOclusion { 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); - //Log.i(TAG, "Apply dilate"); + // Imgproc.dilate(_fgMaskMOG2, _fgMaskMOG2, _morphKernel); + // Log.i(TAG, "Apply dilate"); Scalar suma = Core.sumElems(_fgMaskMOG2); Log.i(TAG, "SUMA = " + suma); _estadoANTERIOR = _estadoACTUAL; - if (suma.val[0] > 1250000){ + if (suma.val[0] > 1250000) { Log.i(TAG, "MANO !!!"); - _estadoACTUAL = OCLUSION; - Core.putText(_fgMaskMOG2, "MANO !!!", new Point(20, 20),Core.FONT_HERSHEY_SIMPLEX, 0.8 , new Scalar(255,255,0)); + _estadoACTUAL = OCLUSION; + /*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 - } - } - - /*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; - } + 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 + } } - 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 - }*/ - - /*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"); - Mat region = new Mat(); - Imgproc.cvtColor(_fgMaskMOG2, region, Imgproc.COLOR_GRAY2RGBA,4); - return region; + //Imgproc.cvtColor(_fgMaskMOG2, _resultado, Imgproc.COLOR_GRAY2RGBA, 4); + return (_estadoACTUAL == ESTABLE); } } +/* + * 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 } + */ + +/* + * 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(); + */ \ No newline at end of file diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java index 0b3e650328f65a285b0c1507eae8c1c8b21c2898..e30c73569e36a879dd571e8680cefcfdd1ef3ee2 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Manager.java @@ -7,6 +7,7 @@ import android.media.AudioManager; import android.media.ToneGenerator; import android.util.Log; import uy.edu.fing.chesstrack.communication.Client; +import uy.edu.fing.chesstrack.modulomodelador.Modelador; public class Manager { @@ -29,10 +30,11 @@ public class Manager { private static Adquisicion _adquisicion; private static Client _client; private static DetectorOclusion _detectorOclusion; + private static Modelador _modelador; private boolean _debug; protected Manager() { - _estado = ARMANDO_TABLERO; + _estado = JUGANDO; _salida = NOT; _adquisicion = null; _client = null; @@ -62,12 +64,37 @@ public class Manager { _salida = OK; } + public boolean calibrar(Mat frame) { + Log.i(TAG, "Calibrando"); + if (Calibracion.getInstance().calibrar(frame)) { + ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, + 50); + toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // ms + if (_salida == OK) { + _client.SendData("FIN calibrar\n . . . armando tablero!\n"); + } + try { + _adquisicion = new Adquisicion(); + _detectorOclusion = new DetectorOclusion(); + _modelador = new Modelador(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + Log.i(TAG, "No calibrado"); + ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); + toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 700); + return false; + } + public Mat processFrame(Mat inputFrame) { Log.i(TAG, "Acondicionamiento"); Mat region = _adquisicion.processFrame(inputFrame); - Log.i(TAG, "TYPE=" + (inputFrame.type()==CvType.CV_8UC4)); - Log.i(TAG, "CHANNEL=" + (inputFrame.channels()==4)); + Log.i(TAG, "TYPE=" + (inputFrame.type() == CvType.CV_8UC4)); + Log.i(TAG, "CHANNEL=" + (inputFrame.channels() == 4)); switch (_estado) { case ARMANDO_TABLERO: @@ -78,52 +105,33 @@ public class Manager { // Modelador -> genera la imagen 0-1 y se la pasa al manager // Modelador.Validar // - region = _detectorOclusion.procesarImagen(region); // cuando paso a estado jugando mando al socket si salida==OK + break; case JUGANDO: Log.i(TAG, "Jugando"); - // respuesta: {MANO - NO MANO} - // SI mano --> nada - // SINO matriz-0-1 - - // BackgoundSupress -> busca la mano y retorna si o no - // Modelador -> genera la imagen 0-1 y se la pasa al manager - // mando al cliente la MATRIZ !! + if (_detectorOclusion.hayNuevoTableroValido(region)) { + Log.i(TAG, "Tablero Valido\n"); + // llamar al modelador + Mat aux = _modelador.getMatrizFichas(region); + Log.i(TAG, "MATRIZ=" + aux.dump()); + region = _modelador.dibujarEscaquesSobel(); + + if (_salida == OK) { + _client.SendData("Nuevo Tablero Valido!\n"); + _client.SendData(aux.dump().concat("\n")); + } + } break; } - + if (_debug) { Mat tmp = Mat.zeros(inputFrame.size(), CvType.CV_8UC4); Mat matTMP = tmp.submat(Calibracion.getRectROI()); region.copyTo(matTMP); return tmp; - } - return inputFrame; - } - - public boolean calibrar(Mat frame) { - Log.i(TAG, "Calibrando"); - if (Calibracion.getInstance().calibrar(frame)) { - ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, - 50); - toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // ms - if (_salida == OK) { - _client.SendData("FIN calibrar\n . . . armando tablero!"); - } - try { - _adquisicion = new Adquisicion(); - _detectorOclusion = new DetectorOclusion(); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; } - Log.i(TAG, "No calibrado"); - ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); - toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 700); - return false; + return inputFrame; } public void destroy() { diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java index b79be6f0a45585eaad0737bc06489d1d1140907f..e4d37c569470d8e58ed8bd0d912a7418a0938d45 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java @@ -75,12 +75,6 @@ public class Homografia implements ImgProcInterface { // hace la homografia con la matriz calculada en un ppio Imgproc.warpPerspective(inputFrame,inputFrame, _matrizTransformada, inputFrame.size()); - -// Mat subMat = inputFrame.submat(_rectROI); -// Mat tmp = Mat.zeros(inputFrame.size(), CvType.CV_8UC4); -// Mat matTMP = tmp.submat(_rectROI); -// subMat.copyTo(matTMP); - Mat tmp = Mat.zeros(_rectROI.size(), CvType.CV_8UC4); (inputFrame.submat(_rectROI)).copyTo(tmp);