Skip to content
Snippets Groups Projects
Commit 3b45ecb4 authored by Nicolas Furquez's avatar Nicolas Furquez
Browse files

se agrega deteccion de fichas usando sobel

parent 45514dd8
No related branches found
No related tags found
No related merge requests found
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="uy.edu.fing.chesstrack"
android:versionCode="1"
android:versionName="1.0" >
<!-- <application -->
<!-- android:allowBackup="true" -->
<!-- android:icon="@drawable/ic_launcher" -->
<!-- android:label="@string/app_name" -->
<!-- android:theme="@style/AppTheme" > -->
<!-- </application> -->
<application
android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<activity android:name="ChessTrackActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true" />
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front" android:required="false"/>
<uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
</manifest>
package uy.edu.fing.chesstrack;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
......@@ -8,6 +7,7 @@ import org.opencv.android.JavaCameraView;
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;
......@@ -27,11 +27,12 @@ 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 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 = ""
+ "--------------------------------------------------------------------------\n"
+ " .:: CHESSTRACK ::. seguimiento de una partida de Ajedrez\n"
......@@ -40,41 +41,42 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
+ "--------------------------------------------------------------------------\n";
private CameraBridgeViewBase mOpenCvCameraView;
//private JavaCameraView mOpenCvCameraView;
// private JavaCameraView mOpenCvCameraView;
private Adquisicion adq;
private Calibracion calibrar;
private Button btnCalibrar;
private Client ClientCommunication;
private MenuItem mItemCalibrar;
//TODO es chancho pero ver luego
private MenuItem mItemServer;
// TODO es chancho pero ver luego
private Mat frame;
private boolean isUsed;
private boolean isCalibrada ;
private boolean isCalibrada;
private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(
this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
}
break;
default: {
super.onManagerConnected(status);
} break;
}
break;
}
}
};
@Override
public void onResume()
{
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
......@@ -90,16 +92,16 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
Modelador.getInstance();
try {
isUsed = false;
isCalibrada =false;
isCalibrada = false;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
getServerIp();
// getServerIp();
}
public void getServerIp(){
public void getServerIp() {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Communication Setup");
alert.setMessage("Set server ip");
......@@ -108,32 +110,32 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
alert.setView(input);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
Editable value = input.getText();
if (value == null || value.toString().equals("") || !value.toString().matches(IPV4_REGEX)) {
Log.i(TAG,"INPUT= not valid IP" + value.toString());
Log.i(TAG, "INPUT= not valid IP" + value.toString());
getServerIp();
} else {
Log.i(TAG,"INPUT=" + value.toString());
Log.i(TAG,"IP=" + value.toString());
Log.i(TAG, "INPUT=" + value.toString());
Log.i(TAG, "IP=" + value.toString());
getServerPort(value.toString());
}
}
}
});
/*
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// no server communication -- FIXME do not send info to client
}
});
*/
* 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();
}
public void getServerPort(final String ip){
public void getServerPort(final String ip) {
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Communication Setup");
alert.setMessage("Set server port");
......@@ -142,30 +144,34 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
alert.setView(input);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
Editable value = input.getText();
Log.i(TAG,"INPUT=" + value.toString());
if (value == null || value.toString().equals("") || !value.toString().matches(PORT_REGEX)) {
Log.i(TAG,"INPUT= not valid PORT" + value.toString());
Log.i(TAG, "INPUT=" + value.toString());
if (value == null || value.toString().equals("")
|| !value.toString().matches(PORT_REGEX)) {
Log.i(TAG, "INPUT= not valid PORT" + value.toString());
getServerPort(ip);
} else {
Log.i(TAG,"INPUT=" + value.toString());
Log.i(TAG, "INPUT=" + value.toString());
int port = Integer.parseInt(value.toString());
Log.i(TAG,"PORT=" + port);
//ClientCommunication = Client.getInstance();
//ClientCommunication.EstablishConnection(ip, port);
//ClientCommunication.SendData(welcomeMSG);
Log.i(TAG, "PORT=" + port);
// ClientCommunication = Client.getInstance();
// ClientCommunication.EstablishConnection(ip, port);
// ClientCommunication.SendData(welcomeMSG);
}
}
}
});
alert.show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
Log.i(TAG, "called onCreateOptionsMenu");
mItemCalibrar = menu.add("Show/hide tile numbers");
mItemCalibrar = menu.add("Calibrar..");
mItemServer = menu.add("Conectar Server");
return true;
}
......@@ -175,11 +181,13 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
Log.i(TAG, "Menu Item selected " + item);
if (item == mItemCalibrar) {
isUsed = true;
if(frame!=null){
if (Calibracion.getInstance().calibrar(frame)){
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
ToneGenerator toneG = new ToneGenerator(
AudioManager.STREAM_ALARM, 50);
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,
200); // 200 is duration in ms
try {
adq = new Adquisicion();
} catch (Exception e) {
......@@ -187,20 +195,22 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
e.printStackTrace();
}
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
} else {
ToneGenerator toneG = new ToneGenerator(
AudioManager.STREAM_ALARM, 50);
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,
700); // 200 is duration in ms
}
}
isUsed = false;
}else if(item == mItemServer){
getServerIp();
}
return true;
}
@Override
public void onPause()
{
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView();
......@@ -229,18 +239,18 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
@Override
public Mat onCameraFrame(Mat inputFrame) {
// TODO MANEJAR ESTADOS
if (!isUsed){
if (!isUsed) {
frame = inputFrame;
}
if(isCalibrada){
if (isCalibrada) {
Log.i(TAG, "calibrada");
inputFrame = adq.processFrame(inputFrame);
Modelador.getInstance().dividirTablero(inputFrame);
return Modelador.getInstance().dibujarEscaque();
//return inputFrame;
return Modelador.getInstance().dibujarEscaquesSobel();
// return inputFrame;
}
return inputFrame;
......
......@@ -6,6 +6,7 @@ import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import uy.edu.fing.chesstrack.modulovision.Calibracion;
import android.util.Log;
......@@ -35,6 +36,7 @@ public class Modelador {
}
public void dividirTablero(Mat inputFrame){
Rect roi = Calibracion.getInstance().getRectPOI();
Mat proccesFrame = inputFrame.submat(roi);
int largo = proccesFrame.rows();
......@@ -73,4 +75,60 @@ public class Modelador {
return tmp;
}
public Mat dibujarEscaquesCanny(){
Mat tmp = Mat.zeros(Calibracion.getInstance().getImagenCalibrada().size(), 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();
int pos_x = 0;
int pos_y = 0;
for (int i = 0; i < CANT_FILAS; i++){
for (int j = 0; j < CANT_FILAS; j++){
pos_x = (int) (escaques[i][j].size().width*i);
pos_y = (int) (escaques[i][j].size().height*j);
subm = tmp.submat(new Rect(new Point(pos_x,pos_y) ,escaques[i][j].size()));
Imgproc.Canny(escaques[i][j], mIntermediateMat, 80, 90);
Imgproc.cvtColor(mIntermediateMat, subm, Imgproc.COLOR_GRAY2RGBA,4);
// escaques[i][j].copyTo(subm);
// Core.putText(tmp, Integer.toString(i)+ "-" +Integer.toString(j), new Point(pos_x+1, pos_y+1),Core.FONT_HERSHEY_SIMPLEX, 0.3 , new Scalar(255,0,0));
}
}
return tmp;
}
public Mat dibujarEscaquesSobel(){
Mat tmp = Mat.zeros(Calibracion.getInstance().getImagenCalibrada().size(), 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();
int pos_x = 0;
int pos_y = 0;
for (int i = 0; i < CANT_FILAS; i++){
for (int j = 0; j < CANT_FILAS; j++){
pos_x = (int) (escaques[i][j].size().width*i);
pos_y = (int) (escaques[i][j].size().height*j);
subm = tmp.submat(new Rect(new Point(pos_x,pos_y) ,escaques[i][j].size()));
Imgproc.cvtColor(escaques[i][j] ,mIntermediateMat, Imgproc.COLOR_RGBA2GRAY,4);
Imgproc.Sobel(mIntermediateMat, mIntermediateMat, CvType.CV_8U, 1, 1);
Core.convertScaleAbs(mIntermediateMat, mIntermediateMat, 10, 0);
Imgproc.threshold(mIntermediateMat, mIntermediateMat, 70, 255, Imgproc.THRESH_BINARY);
int cant_pix = mIntermediateMat.cols()*mIntermediateMat.rows();
int cant_pix_white = Core.countNonZero(mIntermediateMat);
Log.i(TAG, "cant_pix=" + cant_pix);
Log.i(TAG, "cant_pix_white=" + cant_pix_white);
if (cant_pix_white > (50) ){
Imgproc.cvtColor(mIntermediateMat, subm, Imgproc.COLOR_GRAY2RGBA,4);
}else{
escaques[i][j].copyTo(subm);
}
}
}
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