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; package uy.edu.fing.chesstrack;
import org.opencv.android.BaseLoaderCallback; import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase; import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener; import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
...@@ -8,6 +7,7 @@ import org.opencv.android.JavaCameraView; ...@@ -8,6 +7,7 @@ import org.opencv.android.JavaCameraView;
import org.opencv.android.LoaderCallbackInterface; import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader; import org.opencv.android.OpenCVLoader;
import org.opencv.core.Mat; import org.opencv.core.Mat;
import uy.edu.fing.chesstrack.communication.Client; import uy.edu.fing.chesstrack.communication.Client;
import uy.edu.fing.chesstrack.modulomodelador.Modelador; import uy.edu.fing.chesstrack.modulomodelador.Modelador;
import uy.edu.fing.chesstrack.modulovision.Adquisicion; import uy.edu.fing.chesstrack.modulovision.Adquisicion;
...@@ -27,7 +27,8 @@ import android.view.WindowManager; ...@@ -27,7 +27,8 @@ import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; 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 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 IPV4_REGEX = "^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$";
...@@ -47,34 +48,35 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -47,34 +48,35 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
private Button btnCalibrar; private Button btnCalibrar;
private Client ClientCommunication; private Client ClientCommunication;
private MenuItem mItemCalibrar; private MenuItem mItemCalibrar;
private MenuItem mItemServer;
// TODO es chancho pero ver luego // TODO es chancho pero ver luego
private Mat frame; private Mat frame;
private boolean isUsed; private boolean isUsed;
private boolean isCalibrada; private boolean isCalibrada;
private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { private final BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(
this) {
@Override @Override
public void onManagerConnected(int status) { public void onManagerConnected(int status) {
switch (status) { switch (status) {
case LoaderCallbackInterface.SUCCESS: case LoaderCallbackInterface.SUCCESS: {
{
Log.i(TAG, "OpenCV loaded successfully"); Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView(); mOpenCvCameraView.enableView();
} break; }
default: break;
{ default: {
super.onManagerConnected(status); super.onManagerConnected(status);
} break; }
break;
} }
} }
}; };
@Override @Override
public void onResume() public void onResume() {
{
super.onResume(); super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this,
mLoaderCallback);
} }
@Override @Override
...@@ -96,7 +98,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -96,7 +98,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
// TODO Auto-generated catch block // TODO Auto-generated catch block
e.printStackTrace(); e.printStackTrace();
} }
getServerIp(); // getServerIp();
} }
public void getServerIp() { public void getServerIp() {
...@@ -108,6 +110,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -108,6 +110,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
alert.setView(input); alert.setView(input);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) { public void onClick(DialogInterface dialog, int whichButton) {
Editable value = input.getText(); 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)) {
...@@ -123,11 +126,10 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -123,11 +126,10 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
}); });
/* /*
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { * alert.setNegativeButton("Cancel", new
public void onClick(DialogInterface dialog, int whichButton) { * DialogInterface.OnClickListener() { public void
// no server communication -- FIXME do not send info to client * onClick(DialogInterface dialog, int whichButton) { // no server
} * communication -- FIXME do not send info to client } });
});
*/ */
alert.show(); alert.show();
...@@ -142,10 +144,12 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -142,10 +144,12 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
alert.setView(input); alert.setView(input);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) { public void onClick(DialogInterface dialog, int whichButton) {
Editable value = input.getText(); Editable value = input.getText();
Log.i(TAG, "INPUT=" + value.toString()); Log.i(TAG, "INPUT=" + value.toString());
if (value == null || value.toString().equals("") || !value.toString().matches(PORT_REGEX)) { if (value == null || value.toString().equals("")
|| !value.toString().matches(PORT_REGEX)) {
Log.i(TAG, "INPUT= not valid PORT" + value.toString()); Log.i(TAG, "INPUT= not valid PORT" + value.toString());
getServerPort(ip); getServerPort(ip);
} else { } else {
...@@ -162,10 +166,12 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -162,10 +166,12 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
alert.show(); alert.show();
} }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
Log.i(TAG, "called onCreateOptionsMenu"); Log.i(TAG, "called onCreateOptionsMenu");
mItemCalibrar = menu.add("Show/hide tile numbers"); mItemCalibrar = menu.add("Calibrar..");
mItemServer = menu.add("Conectar Server");
return true; return true;
} }
...@@ -178,8 +184,10 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -178,8 +184,10 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
if (frame != null) { if (frame != null) {
if (Calibracion.getInstance().calibrar(frame)) { if (Calibracion.getInstance().calibrar(frame)) {
ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); ToneGenerator toneG = new ToneGenerator(
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms AudioManager.STREAM_ALARM, 50);
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,
200); // 200 is duration in ms
try { try {
adq = new Adquisicion(); adq = new Adquisicion();
} catch (Exception e) { } catch (Exception e) {
...@@ -188,19 +196,21 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -188,19 +196,21 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
} }
isCalibrada = true; isCalibrada = true;
} else { } else {
ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50); ToneGenerator toneG = new ToneGenerator(
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 700); // 200 is duration in ms AudioManager.STREAM_ALARM, 50);
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD,
700); // 200 is duration in ms
} }
} }
isUsed = false; isUsed = false;
}else if(item == mItemServer){
getServerIp();
} }
return true; return true;
} }
@Override @Override
public void onPause() public void onPause() {
{
super.onPause(); super.onPause();
if (mOpenCvCameraView != null) { if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView(); mOpenCvCameraView.disableView();
...@@ -239,7 +249,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener ...@@ -239,7 +249,7 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
inputFrame = adq.processFrame(inputFrame); inputFrame = adq.processFrame(inputFrame);
Modelador.getInstance().dividirTablero(inputFrame); Modelador.getInstance().dividirTablero(inputFrame);
return Modelador.getInstance().dibujarEscaque(); return Modelador.getInstance().dibujarEscaquesSobel();
// return inputFrame; // return inputFrame;
} }
......
...@@ -6,6 +6,7 @@ import org.opencv.core.Mat; ...@@ -6,6 +6,7 @@ import org.opencv.core.Mat;
import org.opencv.core.Point; import org.opencv.core.Point;
import org.opencv.core.Rect; import org.opencv.core.Rect;
import org.opencv.core.Scalar; import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import uy.edu.fing.chesstrack.modulovision.Calibracion; import uy.edu.fing.chesstrack.modulovision.Calibracion;
import android.util.Log; import android.util.Log;
...@@ -35,6 +36,7 @@ public class Modelador { ...@@ -35,6 +36,7 @@ public class Modelador {
} }
public void dividirTablero(Mat inputFrame){ public void dividirTablero(Mat inputFrame){
Rect roi = Calibracion.getInstance().getRectPOI(); Rect roi = Calibracion.getInstance().getRectPOI();
Mat proccesFrame = inputFrame.submat(roi); Mat proccesFrame = inputFrame.submat(roi);
int largo = proccesFrame.rows(); int largo = proccesFrame.rows();
...@@ -73,4 +75,60 @@ public class Modelador { ...@@ -73,4 +75,60 @@ public class Modelador {
return tmp; 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.
Please register or to comment