From aab5454f61542e1b8157fbfa3fdd2fc97d7f4ea7 Mon Sep 17 00:00:00 2001
From: nfurquez <nfurquez@fing.edu.uy>
Date: Wed, 16 Jul 2014 22:19:09 -0300
Subject: [PATCH] se corrigio homografia y recorte, la apk suma homografia mas
 ecualizacion

---
 .../fing/chesstrack/ChessTrackActivity.java   | 15 ++-----
 .../chesstrack/modulovision/Adquisicion.java  | 28 ++----------
 .../chesstrack/modulovision/Calibracion.java  |  5 +--
 .../modulovision/imgproc/Homografia.java      | 44 ++++++++++++++-----
 4 files changed, 40 insertions(+), 52 deletions(-)

diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java
index 42499d8..98b1132 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java
@@ -72,9 +72,6 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 		mOpenCvCameraView.setCvCameraViewListener(this);
 
 		calibrar = new Calibracion();
-
-
-
 		isUsed = false;
 		isCalibrada =false;
 		addListenerOnButton();
@@ -96,6 +93,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 						toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms
 
 						adq = new Adquisicion(calibrar);
+
 					}else{
 						ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50);
 						toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 700); // 200 is duration in ms
@@ -138,21 +136,14 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 
 	@Override
 	public Mat onCameraFrame(Mat inputFrame) {
-		// TODO Auto-generated method stub
-		//return adq.processFrame(inputFrame);
+		// TODO MANEJAR ESTADOS
 		if (!isUsed){
 			frame = inputFrame;
 		}
 
 		if(isCalibrada){
 
-			/*
-			Core.circle(inputFrame, calibrar.getVertices().toList().get(0), 10, new Scalar(0,0 , 255, 255),-25);
-			Core.circle(inputFrame, calibrar.getVertices().toList().get(6), 10, new Scalar(0,255 , 255, 0),-25);
-			Core.circle(inputFrame, calibrar.getVertices().toList().get(42), 10, new Scalar(0,0 , 0, 255),-25)
-			Core.circle(inputFrame, calibrar.getVertices().toList().get(48), 10, new Scalar(0,0 , 128, 255),-25);
-			return inputFrame ;
-			 */
+			Log.i(TAG, "calibrada");
 			return adq.processFrame(inputFrame);
 		}
 
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 87e3168..82bc812 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java
@@ -7,6 +7,7 @@ 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 android.util.Log;
@@ -23,8 +24,9 @@ public class Adquisicion   {
 		super();
 		Log.i(TAG, "Cargado....");
 		listProc = new ArrayList<ImgProcInterface>();
-		//listProc.add( new EcualizarImagen());
+
 		listProc.add( new Homografia(cal.getVertices()));
+		listProc.add( new EcualizarImagen());
 	}
 
 	/**
@@ -37,34 +39,10 @@ public class Adquisicion   {
 	public synchronized Mat processFrame(Mat inputPicture) {
 		Log.i(TAG, "processFrame inicia");
 		Mat salida = inputPicture;
-		//
-		//		//		Core.line(salida, new Point(0, 5), new Point(salida.cols()/2,salida.rows()/2), new Scalar(0, 255, 0, 255), 3);
-		//
-		//		//		Core.circle(salida,  new Point(salida.cols()/2,salida.rows()/2), 120, new Scalar(0,0 , 255, 255));
-		//
-		//		MatOfPoint2f pointBuf;
-		//		boolean found = Calib3d.findChessboardCorners( salida, salida.size(), pointBuf,
-		//				Calib3d.CALIB_CB_ADAPTIVE_THRESH |Calib3d.CALIB_CB_FAST_CHECK | Calib3d.CALIB_CB_NORMALIZE_IMAGE);
-		//		if (found){
-		//			Mat viewGray;
-		//			Imgproc.cvtColor(salida, viewGray, Imgproc.COLOR_BGR2GRAY);
-		//			cornerSubPix( viewGray, pointBuf, new Size(11,11),
-		//					new Size(-1,-1), TermCriteria( TermCriteria.TERMCRIT_EPS+TermCriteria.TERMCRIT_ITER, 30, 0.1 ));
-		//
-		//
-		//
-		//			MatOfPoint2f corners = new MatOfPoint2f();
-		//			Imgproc.cornerSubPix(image, corners , winSize, zeroZone, criteria);
-		//			Calib3d.drawChessboardCorners(salida, new Size(5, 5), corners, patternWasFound);
-		//		}
-
 		Mat prevImg = inputPicture;
-
 		for (ImgProcInterface proc: listProc){
 			prevImg = proc.procesarImagen(prevImg);
 		}
-
-
 		return prevImg;
 
 	}
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 6194b80..cf0c32a 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Calibracion.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Calibracion.java
@@ -28,10 +28,7 @@ public class Calibracion  {
 			Log.i(TAG, "Encontro = " + corners.size().toString());
 			Calib3d.drawChessboardCorners(imagenCalibrada, patternSize, corners, ret);
 			vertices = corners;
-			//
-			//			for(Point p : vertices.toList()){
-			//				Log.i(TAG, "Encontro = " + Math.round(p.x) + " " + Math.round(p.y));
-			//			}
+
 		}
 		OK = ret;
 
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 96ece9e..0b2e13c 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
@@ -4,17 +4,21 @@ import org.opencv.core.CvType;
 import org.opencv.core.Mat;
 import org.opencv.core.MatOfPoint2f;
 import org.opencv.core.Point;
+import org.opencv.core.Rect;
 import org.opencv.imgproc.Imgproc;
 
-public class Homografia implements ImgProcInterface {
+import android.util.Log;
 
+public class Homografia implements ImgProcInterface {
 
-	private final   Mat matrizTransformada;
+	private static final String TAG = "CHESSTRACK::Homografia";
+	private final  Mat matrizTransformada;
+	private final Rect rectPOI;
 
 	public Homografia(MatOfPoint2f vertices) {
 		super();
-		int offset = 48*2;
-		int media = 48*6;
+		//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;
@@ -22,19 +26,37 @@ public class Homografia implements ImgProcInterface {
 		p2 = vertices.toList().get(6);
 		p3 = vertices.toList().get(42);
 		p4 = vertices.toList().get(48);
-		src.put((int)p1.y,(int)p1.x, (int)p2.y,(int)p2.x, (int)p4.y,(int)p4.x, (int)p3.y,(int)p3.x);
-		dst.put( offset,offset ,offset+media,offset , offset,offset+media , offset+media,offset+media );
+		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));
 
-		matrizTransformada = Imgproc.getPerspectiveTransform(src,dst);
-	}
+		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);
 
+	}
+	/**
+	 * Hace homografia y recorta la imagen
+	 */
 	@Override
 	public Mat procesarImagen(Mat inputFrame) {
-		Mat out = inputFrame.clone();
-		Imgproc.warpPerspective(inputFrame,out, matrizTransformada, out.size());
-		return inputFrame;
+
+		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);
+		return tmp;
+
 	}
 
 
-- 
GitLab