Skip to content
Snippets Groups Projects
Commit 50b54415 authored by Aylen Ricca's avatar Aylen Ricca
Browse files

restructuration . . .

parent 3d3cea12
No related branches found
No related tags found
No related merge requests found
Showing with 181 additions and 105 deletions
......@@ -8,16 +8,10 @@ import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat;
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 uy.edu.fing.chesstrack.modulovision.Manager;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
......@@ -27,32 +21,28 @@ import android.view.SurfaceView;
import android.view.WindowManager;
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 WELCOME_MSG = ""
+ "--------------------------------------------------------------------------\n"
+ " .:: CHESSTRACK ::. seguimiento de una partida de Ajedrez\n"
+ "\n"
+ " TImag 2014\n"
+ " Nicolas Furquez - Aylen Ricca\n"
+ "--------------------------------------------------------------------------\n";
// estados
private static final int IDLE = 0;
private static final int CALIBRAR = 1;
private static final int JUGAR = 2;
private CameraBridgeViewBase _mOpenCvCameraView;
// private JavaCameraView _mOpenCvCameraView;
private Adquisicion _adquisicion;
private BackgroundSupress _analizador;
private Client _client;
private Manager _manager;
private MenuItem _mItemCalibrar;
private MenuItem _mItemServer;
private Mat _frame;
private boolean _isUsed;
private boolean _isCalibrada;
private int _estado;
private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(
this) {
@Override
public void onManagerConnected(int status) {
......@@ -73,7 +63,8 @@ public class ChessTrackActivity extends Activity implements 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
......@@ -87,10 +78,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
_mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
_mOpenCvCameraView.setCvCameraViewListener(this);
Modelador.getInstance();
//_analizador = new BackgroundSupress();
_isUsed = false;
_isCalibrada = false;
_manager = Manager.getInstance();
}
public void getServerIp() {
......@@ -143,9 +131,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
int port = Integer.parseInt(value.toString());
Log.i(TAG, "PORT=" + port);
_client = Client.getInstance();
_client.EstablishConnection(ip, port);
_client.SendData(WELCOME_MSG);
_manager.setConnection(ip, port);
}
}
});
......@@ -165,24 +151,9 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
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); //ms
try {
this._adquisicion = new Adquisicion();
} catch (Exception e) {
e.printStackTrace();
}
_isCalibrada = true;
} else {
ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50);
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,700);
}
if (_estado == IDLE) {
_estado = CALIBRAR;
}
_isUsed = false;
} else if (item == _mItemServer) {
getServerIp();
}
......@@ -203,8 +174,8 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
if (_mOpenCvCameraView != null) {
_mOpenCvCameraView.disableView();
}
if (this._client != null) {
this._client.Stop();
if (_manager != null) {
_manager.destroy();
}
}
......@@ -218,18 +189,23 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
@Override
public Mat onCameraFrame(Mat inputFrame) {
// TODO MANEJAR ESTADOS
if (!_isUsed) {
_frame = inputFrame; // FIXME - para qe lo guardo ??
}
if (_isCalibrada) {
Log.i(TAG, "new _frame - calibrada");
inputFrame = _adquisicion.processFrame(inputFrame);
//Modelador.getInstance().dividirTablero(inputFrame);
//return Modelador.getInstance().dibujarEscaquesSobel();
return inputFrame;
if (inputFrame != null) {
switch (_estado) {
case CALIBRAR:
Log.i(TAG, "calibrando...");
if (_manager.calibrar(inputFrame)) {
_estado = JUGAR;
} else {
_estado = IDLE;
}
break;
case JUGAR:
Log.i(TAG, "jugando...");
return _manager.processFrame(inputFrame);
// break;
case IDLE:
break;
}
}
return inputFrame;
}
......
......@@ -37,7 +37,7 @@ public class Modelador {
public void dividirTablero(Mat inputFrame){
Rect roi = Calibracion.getInstance().getRectPOI();
Rect roi = Calibracion.getInstance().getRectROI();
Mat proccesFrame = inputFrame.submat(roi);
int largo = proccesFrame.rows();
int ancho = proccesFrame.cols();
......@@ -58,7 +58,7 @@ public class Modelador {
}
public Mat dibujarEscaque(){
Mat tmp = Mat.ones(Calibracion.getInstance().getImagenCalibrada().size(), CvType.CV_8UC4);
Mat tmp = Mat.ones(Calibracion.getInstance().get_sizeFrame(), CvType.CV_8UC4);
Mat subm ; //tmp.submat(new Rect(new Point(0,0) ,escaques[i][j].size()));
//escaques[i][j].copyTo(subm);
int pos_x = 0;
......@@ -76,7 +76,7 @@ public class Modelador {
}
public Mat dibujarEscaquesCanny(){
Mat tmp = Mat.zeros(Calibracion.getInstance().getImagenCalibrada().size(), CvType.CV_8UC4);
Mat tmp = Mat.zeros(Calibracion.getInstance().get_sizeFrame(), CvType.CV_8UC4);
Mat subm ; //tmp.submat(new Rect(new Point(0,0) ,escaques[i][j].size()));
//escaques[i][j].copyTo(subm);
Mat mIntermediateMat = new Mat();
......@@ -99,7 +99,7 @@ public class Modelador {
}
public Mat dibujarEscaquesSobel(){
Mat tmp = Mat.zeros(Calibracion.getInstance().getImagenCalibrada().size(), CvType.CV_8UC4);
Mat tmp = Mat.zeros(Calibracion.getInstance().get_sizeFrame(), CvType.CV_8UC4);
Mat subm ; //tmp.submat(new Rect(new Point(0,0) ,escaques[i][j].size()));
//escaques[i][j].copyTo(subm);
Mat mIntermediateMat = new Mat();
......
package uy.edu.fing.chesstrack.modulovision;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Mat;
import uy.edu.fing.chesstrack.modulovision.imgproc.BackgroundSupress;
import uy.edu.fing.chesstrack.modulovision.imgproc.EcualizarImagen;
import uy.edu.fing.chesstrack.modulovision.imgproc.Homografia;
import uy.edu.fing.chesstrack.modulovision.imgproc.ImgProcInterface;
import android.util.Log;
public class Adquisicion {
private static final String TAG = "CHESSTRACK::Adquisicion";
......@@ -27,7 +21,7 @@ public class Adquisicion {
_listProc.add(new Homografia());
//_listProc.add(new EcualizarImagen());
_listProc.add(new BackgroundSupress());
//_listProc.add(new BackgroundSupress());
}
/**
......
......@@ -11,10 +11,9 @@ import android.util.Log;
public class Calibracion {
private static final String TAG = "CHESSTRACK::Calibracion";
private Mat _imagenCalibrada;
private Mat _imagenOriginal;
private MatOfPoint2f _vertices;
private static Rect _rectPOI = null;
private Size _sizeFrame = null;
private MatOfPoint2f _vertices = null;
private static Rect _rectROI = null;
private static Calibracion _instance;
......@@ -31,26 +30,27 @@ public class Calibracion {
public boolean calibrar(Mat img) {
Log.i(TAG, "INI calibrando");
_imagenOriginal = img;
_imagenCalibrada = img;
Size patternSize = new Size(7, 7);
MatOfPoint2f corners = new MatOfPoint2f();
boolean ret = Calib3d.findChessboardCorners(_imagenOriginal,patternSize, corners);
boolean ret = Calib3d.findChessboardCorners(img, patternSize, corners);
if (ret) {
Log.i(TAG, "Encontro = " + corners.total());
//Calib3d.drawChessboardCorners(_imagenCalibrada, patternSize, corners, ret); // only for debug
// Calib3d.drawChessboardCorners(img, patternSize, corners, ret);
// only for debug
_vertices = corners;
_sizeFrame = img.size();
}
Log.i(TAG, "FIN calibrando = " + ret);
return ret;
}
public Mat getImagenCalibrada() { // por que no guardar solo el size.. es lo unico qe se necesita
return _imagenCalibrada;
public Size get_sizeFrame() {
return _sizeFrame;
}
public void setImagenCalibrada(Mat imagenCalibrada) {
this._imagenCalibrada = imagenCalibrada;
public void set_sizeFrame(Size _sizeFrame) {
this._sizeFrame = _sizeFrame;
}
public MatOfPoint2f getVertices() {
......@@ -61,12 +61,11 @@ public class Calibracion {
this._vertices = vertices;
}
public static Rect getRectPOI() {
return _rectPOI;
public static Rect getRectROI() {
return _rectROI;
}
public static void setRectPOI(Rect rectPOI) {
Calibracion._rectPOI = rectPOI;
public static void setRectROI(Rect rectROI) {
Calibracion._rectROI = rectROI;
}
}
package uy.edu.fing.chesstrack.modulovision;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.util.Log;
import uy.edu.fing.chesstrack.communication.Client;
public class Manager {
private static final String TAG = "MANAGER";
private static final String TAG = "CHESSTRACK::MANAGER";
private static Manager _instance;
private static final int ARMANDO_TABLERO = 0;
private static final int JUGANDO = 1;
private static final int OK = 1;
private static final int NOT = 0;
private static final String WELCOME_MSG = ""
+ "--------------------------------------------------------------------------\n"
+ " .:: CHESSTRACK ::. seguimiento de una partida de Ajedrez\n"
+ "\n"
+ " TImag 2014\n"
+ " Nicolas Furquez - Aylen Ricca\n"
+ "--------------------------------------------------------------------------\n";
private static int _estado;
private static int _salida;
private static Adquisicion _adquisicion;
private static Client _client;
private boolean _debug;
protected Manager() {
_estado = ARMANDO_TABLERO;
_salida = NOT;
_adquisicion = null;
_client = null;
_debug = true;
}
public static Manager getInstance() {
......@@ -25,4 +53,80 @@ public class Manager {
Manager._estado = _estado;
}
public void setConnection(String ip, int port) {
Log.i(TAG, "Setting connection");
_client = Client.getInstance();
_client.EstablishConnection(ip, port);
_client.SendData(WELCOME_MSG);
_salida = OK;
}
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));
switch (_estado) {
case ARMANDO_TABLERO:
Log.i(TAG, "Armando Tablero");
// respuesta: {PRONTO - NOPRONTO}
// SI pornto --> beep + estado JUGANDO
// SINO --> nada
// Modelador -> genera la imagen 0-1 y se la pasa al manager
// Modelador.Validar
//
// 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 !!
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();
} 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 void destroy() {
if (_client != null) {
_client.Stop();
}
}
}
......@@ -54,8 +54,8 @@ public class BackgroundSupress implements ImgProcInterface {
public Mat procesarImagen(Mat inputFrame) {
Log.i(TAG, "procesar ");
Mat ret = Mat.zeros(Calibracion.getInstance().getImagenCalibrada().size(), CvType.CV_8UC4);
Rect roi = Calibracion.getRectPOI();
Mat ret = Mat.zeros(Calibracion.getInstance().get_sizeFrame(), CvType.CV_8UC4);
Rect roi = Calibracion.getRectROI();
Log.i(TAG, "ROI" + roi.size());
Mat region = ret.submat(roi);
......
......@@ -31,5 +31,4 @@ public class EcualizarImagen implements ImgProcInterface {
Log.i(TAG, "processing Frame - FIN");
return img_hist_equalized;
}
}
......@@ -16,7 +16,7 @@ public class Homografia implements ImgProcInterface {
private static final String TAG = "CHESSTRACK::Homografia";
private final Mat _matrizTransformada;
private final Rect _rectPOI;
private final Rect _rectROI;
private int _media;
private int _offset;
......@@ -29,9 +29,9 @@ public class Homografia implements ImgProcInterface {
Mat dst = new Mat(4,1,CvType.CV_32FC2);
Point p1, p2, p3, p4;
Point[] ret = getBestPoints(vertices, Calibracion.getInstance().getImagenCalibrada().size());
Point[] ret = getBestPoints(vertices, Calibracion.getInstance().get_sizeFrame());
Log.i(TAG, "Best Points= " + ret);
Log.i(TAG, "Best Points= " + ret.toString());
p1 = ret[0];
p2 = ret[1];
p3 = ret[2];
......@@ -46,7 +46,7 @@ public class Homografia implements ImgProcInterface {
_media = (int) Math.floor( Math.round((d12+d23+d34+d14)/4));
// El offset es el tamaño de dos celdas (para abarcar el primer casillero y dejar un borde al tablero
_offset = (_media/6);
_offset = 2*(_media/6);
Log.i(TAG, "media= " + _media);
Log.i(TAG, "offset= " + _offset);
......@@ -54,11 +54,11 @@ public class Homografia implements ImgProcInterface {
src.put(0,0, (int)p1.x,(int)p1.y, (int)p2.x,(int)p2.y, (int)p3.x,(int)p3.y, (int)p4.x,(int)p4.y);
dst.put(0,0, _offset,_offset, _offset+_media,_offset, _offset+_media,_offset+_media, _offset,_offset+_media );
_rectPOI = new Rect(new Point(0,0), new Point(2*_offset+_media,2*_offset+_media));
_rectROI = new Rect(new Point(0,0), new Point(2*_offset+_media,2*_offset+_media));
Calibracion.getInstance();
Calibracion.setRectPOI(_rectPOI);
Calibracion.setRectROI(_rectROI);
Log.i(TAG, "rectPOI size= " + _rectPOI.size());
Log.i(TAG, "rectROI size= " + _rectROI.size());
_matrizTransformada = Imgproc.getPerspectiveTransform(src,dst);
} else {
......@@ -75,10 +75,14 @@ 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(_rectPOI);
Mat tmp = Mat.zeros(inputFrame.size(), CvType.CV_8UC4);
Mat matTMP = tmp.submat(_rectPOI);
subMat.copyTo(matTMP);
// 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);
Log.i(TAG, "processing Frame - FIN");
return tmp;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment