From 0488c62f3d413033c9f8f48fb68702f855ee12ae Mon Sep 17 00:00:00 2001 From: nfurquez <nfurquez@fing.edu.uy> Date: Mon, 21 Jul 2014 20:13:37 -0300 Subject: [PATCH] Se modifica la clase Calibracion para que sea Singleton se agrega una clase para sustrasccion de fondo --- .../fing/chesstrack/ChessTrackActivity.java | 24 +++++--- .../chesstrack/modulovision/Adquisicion.java | 9 +-- .../chesstrack/modulovision/Calibracion.java | 26 +++++++-- .../modulovision/imgproc/Homografia.java | 55 ++++++++++--------- .../imgproc/SustraccionDeFondo.java | 44 +++++++++++++++ 5 files changed, 116 insertions(+), 42 deletions(-) create mode 100644 ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/SustraccionDeFondo.java diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java index 98b1132..b401fcd 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java @@ -70,11 +70,16 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.chess_track_layout); mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE); mOpenCvCameraView.setCvCameraViewListener(this); + try { + + isUsed = false; + isCalibrada =false; + addListenerOnButton(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } - calibrar = new Calibracion(); - isUsed = false; - isCalibrada =false; - addListenerOnButton(); } public void addListenerOnButton() { @@ -87,13 +92,16 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener public void onClick(View arg0) { isUsed = true; if(frame!=null){ - if (calibrar.calibrar(frame)){ + if (Calibracion.getInstance().calibrar(frame)){ isCalibrada = true; ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms - - adq = new Adquisicion(calibrar); - + try { + adq = new Adquisicion(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } }else{ ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 700); // 200 is duration in ms diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java index 82bc812..2a7b0e8 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java @@ -7,9 +7,9 @@ import java.util.List; import org.opencv.core.Mat; -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 uy.edu.fing.chesstrack.modulovision.imgproc.SustraccionDeFondo; import android.util.Log; @@ -20,13 +20,14 @@ public class Adquisicion { private static final String TAG = "CHESSTRACK::Adquisicion"; - public Adquisicion(Calibracion cal) { + public Adquisicion() throws Exception { super(); Log.i(TAG, "Cargado...."); listProc = new ArrayList<ImgProcInterface>(); - listProc.add( new Homografia(cal.getVertices())); - listProc.add( new EcualizarImagen()); + listProc.add( new Homografia()); + //listProc.add( new EcualizarImagen()); + listProc.add( new SustraccionDeFondo()); } /** diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Calibracion.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Calibracion.java index cf0c32a..16bb4fe 100644 --- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Calibracion.java +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Calibracion.java @@ -3,6 +3,7 @@ package uy.edu.fing.chesstrack.modulovision; import org.opencv.calib3d.Calib3d; import org.opencv.core.Mat; import org.opencv.core.MatOfPoint2f; +import org.opencv.core.Rect; import org.opencv.core.Size; import android.util.Log; @@ -13,7 +14,20 @@ public class Calibracion { private Mat imagenOriginal; private MatOfPoint2f vertices; private static final String TAG = "CHESSTRACK::Calibracion"; + private static Rect rectPOI = null; + private static Calibracion instance; + + protected Calibracion(){ + + } + + public static Calibracion getInstance(){ + if(instance == null){ + instance = new Calibracion(); + } + return instance; + } public boolean calibrar(Mat img){ Log.i(TAG, "INI calibrando"); @@ -28,12 +42,8 @@ public class Calibracion { Log.i(TAG, "Encontro = " + corners.size().toString()); Calib3d.drawChessboardCorners(imagenCalibrada, patternSize, corners, ret); vertices = corners; - } OK = ret; - - - Log.i(TAG, "FIN calibrando = " + ret); return OK; } @@ -58,6 +68,14 @@ public class Calibracion { this.vertices = vertices; } + public static Rect getRectPOI() { + return rectPOI; + } + + public static void setRectPOI(Rect rectPOI) { + Calibracion.rectPOI = rectPOI; + } + 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 0b2e13c..8b4b5b2 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 @@ -7,6 +7,7 @@ import org.opencv.core.Point; import org.opencv.core.Rect; import org.opencv.imgproc.Imgproc; +import uy.edu.fing.chesstrack.modulovision.Calibracion; import android.util.Log; public class Homografia implements ImgProcInterface { @@ -15,34 +16,36 @@ public class Homografia implements ImgProcInterface { private final Mat matrizTransformada; private final Rect rectPOI; - public Homografia(MatOfPoint2f vertices) { + public Homografia() throws Exception { super(); - //int offset = 48*2; - //int media = 48*6; - Mat src = new Mat(4,1,CvType.CV_32FC2); - Mat dst = new Mat(4,1,CvType.CV_32FC2); - Point p1,p2,p3,p4; - p1 = vertices.toList().get(0); - p2 = vertices.toList().get(6); - p3 = vertices.toList().get(42); - p4 = vertices.toList().get(48); - double d17 = Math.sqrt(Math.pow((p1.x- p2.x),2) + Math.pow((p1.y- p2.y),2)); - double d749 = Math.sqrt(Math.pow((p2.x- p4.x),2) + Math.pow((p2.y- p4.y),2)); - double d143 = Math.sqrt(Math.pow((p1.x- p3.x),2) + Math.pow((p1.y- p3.y),2)); - double d4349 = Math.sqrt(Math.pow((p3.x- p4.x),2) + Math.pow((p3.y- p4.y),2)); - - int media = (int) Math.floor( Math.round((d17+d749+d143+d4349)/4)); - int offset = 2*(media/7); - 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,offset+media , offset+media,offset+media ); - Log.i(TAG, "offset= " + offset); - Log.i(TAG, "media = " + media); - - // EL offset es casi el tamaño de una celda - rectPOI = new Rect(new Point(0,0), new Point(2*offset+media,2*offset+media)); - - matrizTransformada = Imgproc.getPerspectiveTransform(src,dst); + MatOfPoint2f vertices = Calibracion.getInstance().getVertices(); + if (vertices != null){ + Mat src = new Mat(4,1,CvType.CV_32FC2); + Mat dst = new Mat(4,1,CvType.CV_32FC2); + Point p1,p2,p3,p4; + p1 = vertices.toList().get(0); + p2 = vertices.toList().get(6); + p3 = vertices.toList().get(42); + p4 = vertices.toList().get(48); + double d17 = Math.sqrt(Math.pow((p1.x- p2.x),2) + Math.pow((p1.y- p2.y),2)); + double d749 = Math.sqrt(Math.pow((p2.x- p4.x),2) + Math.pow((p2.y- p4.y),2)); + double d143 = Math.sqrt(Math.pow((p1.x- p3.x),2) + Math.pow((p1.y- p3.y),2)); + double d4349 = Math.sqrt(Math.pow((p3.x- p4.x),2) + Math.pow((p3.y- p4.y),2)); + int media = (int) Math.floor( Math.round((d17+d749+d143+d4349)/4)); + int offset = 2*(media/7); + 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,offset+media , offset+media,offset+media ); + Log.i(TAG, "offset= " + offset); + Log.i(TAG, "media = " + media); + + // EL offset es casi el tamaño de una celda + rectPOI = new Rect(new Point(0,0), new Point(2*offset+media,2*offset+media)); + Calibracion.getInstance().setRectPOI(rectPOI); + matrizTransformada = Imgproc.getPerspectiveTransform(src,dst); + }else{ + throw new Exception(TAG + "No se han calculado los vertices"); + } } /** * Hace homografia y recorta la imagen diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/SustraccionDeFondo.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/SustraccionDeFondo.java new file mode 100644 index 0000000..44dcbdd --- /dev/null +++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/SustraccionDeFondo.java @@ -0,0 +1,44 @@ +package uy.edu.fing.chesstrack.modulovision.imgproc; + +import org.opencv.core.Mat; +import org.opencv.imgproc.Imgproc; +import org.opencv.video.BackgroundSubtractorMOG2; + + +public class SustraccionDeFondo implements ImgProcInterface { + private Mat fMaskMOG = null; + private final BackgroundSubtractorMOG2 pMOG; + private static final String TAG = "CHESSTRACK::SustraccionDeFondo"; + public SustraccionDeFondo(){ + pMOG = new BackgroundSubtractorMOG2(); + //fMaskMOG = new Mat(); + } + + @Override + public Mat procesarImagen(Mat inputFrame) { + Imgproc.cvtColor(inputFrame, inputFrame, Imgproc.COLOR_RGBA2RGB); + + fMaskMOG = new Mat(inputFrame.size(),inputFrame.channels()); + pMOG.apply(inputFrame, fMaskMOG); + //Mat frame = inputFrame.submat(Calibracion.getInstance().getRectPOI()); + + //fMaskMOG = new Mat(frame.size(),frame.channels()); + //pMOG.apply(frame, fMaskMOG); + + //Imgproc.resize(inputFrame, frame, frame.size()); + //Log.i(TAG, "Size frame= " + frame.size()); + //Log.i(TAG, "Size fMaskMOG= " + fMaskMOG.size()); + + //Rect aux = Calibracion.getInstance().getRectPOI(); + + + //frame.copyTo(frame,fMaskMOG); + + //Mat subMat = inputFrame.submat(0,frame.rows(),0,frame.cols()); + //frame.copyTo(subMat); + //Mat frame = new Mat(); + //inputFrame.copyTo(frame,fMaskMOG); + return fMaskMOG; + } + +} -- GitLab