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

clear code and flow

parent bdee6e55
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
}
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;
}
}
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;
}
}
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