Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Recognize.java #28

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
276 changes: 36 additions & 240 deletions facerecognition/src/main/java/cultoftheunicorn/marvel/Recognize.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.cultoftheunicorn.marvel.R;
import org.opencv.objdetect.CascadeClassifier;

import java.io.File;
Expand All @@ -40,52 +39,49 @@

public class Recognize extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {

private static final String TAG = "OCVSample::Activity";
private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255);
public static final int JAVA_DETECTOR = 0;
public static final int NATIVE_DETECTOR = 1;
private static final String TAG = "OCVSample::Activity";
private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255);
public static final int JAVA_DETECTOR = 0;
public static final int NATIVE_DETECTOR = 1;

public static final int SEARCHING= 1;
public static final int IDLE= 2;
public static final int SEARCHING = 1;
public static final int IDLE = 2;

private static final int frontCam =1;
private static final int backCam =2;
private static final int FRONT_CAM = 1;
private static final int BACK_CAM = 2;

private int faceState = IDLE;

private int faceState=IDLE;


private Mat mRgba;
private Mat mGray;
private Mat mRgba;
private Mat mGray;
private File mCascadeFile;
private CascadeClassifier mJavaDetector;

private int mDetectorType = JAVA_DETECTOR;
private String[] mDetectorName;
private int mDetectorType = JAVA_DETECTOR;
private String[] mDetectorName;

private float mRelativeFaceSize = 0.2f;
private int mAbsoluteFaceSize = 0;
private int mLikely=999;
private float mRelativeFaceSize = 0.2f;
private int mAbsoluteFaceSize = 0;
private int mLikely = 999;

String mPath="";
private String mPath = "";

private Tutorial3View mOpenCvCameraView;
private Tutorial3View mOpenCvCameraView;

private ImageView Iv;
Bitmap mBitmap;
Handler mHandler;

PersonRecognizer fr;
ToggleButton scan;
private Bitmap mBitmap;
private Handler mHandler;

Set<String> uniqueNames = new HashSet<String>();
private PersonRecognizer fr;
private ToggleButton scan;

// max number of people to detect in a session
String[] uniqueNamesArray = new String[10];
private Set<String> uniqueNames = new HashSet<>();
private String[] uniqueNamesArray = new String[10];

static final long MAXIMG = 10;
private static final long MAXIMG = 10;

Labels labelsFile;

static {
OpenCVLoader.initDebug();
System.loadLibrary("opencv_java");
Expand All @@ -95,53 +91,16 @@ public class Recognize extends AppCompatActivity implements CameraBridgeViewBase
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");

fr=new PersonRecognizer(mPath);
String s = getResources().getString(R.string.Straininig);
//Toast.makeText(getApplicationContext(),s, Toast.LENGTH_LONG).show();
fr.load();

try {
// load cascade file from application resources
InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
mCascadeFile = new File(cascadeDir, "lbpcascade.xml");
FileOutputStream os = new FileOutputStream(mCascadeFile);

byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
is.close();
os.close();

mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
if (mJavaDetector.empty()) {
Log.e(TAG, "Failed to load cascade classifier");
mJavaDetector = null;
} else
Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());

cascadeDir.delete();

} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
}

initializeClassifier();
mOpenCvCameraView.enableView();

} break;
default:
{
}
break;
default: {
super.onManagerConnected(status);
} break;


}
break;
}
}
};
Expand All @@ -150,7 +109,6 @@ public Recognize() {
mDetectorName = new String[2];
mDetectorName[JAVA_DETECTOR] = "Java";
mDetectorName[NATIVE_DETECTOR] = "Native (tracking)";

Log.i(TAG, "Instantiated new " + this.getClass());
}

Expand All @@ -159,169 +117,7 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recognize);

scan = (ToggleButton) findViewById(R.id.scan);
final TextView results = (TextView) findViewById(R.id.results);

mOpenCvCameraView = (Tutorial3View) findViewById(R.id.tutorial3_activity_java_surface_view);
mOpenCvCameraView.setCvCameraViewListener(this);

//mPath=getFilesDir()+"/facerecogOCV/";
mPath = Environment.getExternalStorageDirectory()+"/facerecogOCV/";

Log.e("Path", mPath);

labelsFile= new Labels(mPath);

mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
/*
display a newline separated list of individual names
*/
String tempName = msg.obj.toString();
if (!(tempName.equals("Unknown"))) {
tempName = capitalize(tempName);
uniqueNames.add(tempName);
uniqueNamesArray = uniqueNames.toArray(new String[uniqueNames.size()]);
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < uniqueNamesArray.length; i++) {
strBuilder.append(uniqueNamesArray[i] + "\n");
}
String textToDisplay = strBuilder.toString();
results.setText(textToDisplay);
}
}
};

scan.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b) {
if(!fr.canPredict()) {
scan.setChecked(false);
Toast.makeText(getApplicationContext(), getResources().getString(R.string.SCanntoPredic), Toast.LENGTH_LONG).show();
return;
}
faceState = SEARCHING;
}
else {
faceState = IDLE;
}
}
});

boolean success=(new File(mPath)).mkdirs();
if (!success)
{
Log.e("Error","Error creating directory");
}

Button submit = (Button) findViewById(R.id.submit);
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(uniqueNames.size() > 0) {
Intent intent = new Intent(Recognize.this, ReviewResults.class);
intent.putExtra("list", uniqueNamesArray);
startActivity(intent);
}
else {
Toast.makeText(Recognize.this, "Empty list cannot be sent further", Toast.LENGTH_LONG).show();
}
}
});

}
scan = findViewById(R.id.scan);
final TextView results = findViewById(R.id.results);

@Override
public void onCameraViewStarted(int width, int height) {
mGray = new Mat();
mRgba = new Mat();
}

@Override
public void onCameraViewStopped() {
mGray.release();
mRgba.release();
}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
mGray = inputFrame.gray();

if (mAbsoluteFaceSize == 0) {
int height = mGray.rows();
if (Math.round(height * mRelativeFaceSize) > 0) {
mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
}
// mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);
}

MatOfRect faces = new MatOfRect();

if (mDetectorType == JAVA_DETECTOR) {
if (mJavaDetector != null)
mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
}
else if (mDetectorType == NATIVE_DETECTOR) {
/*if (mNativeDetector != null)
mNativeDetector.detect(mGray, faces);*/
}
else {
Log.e(TAG, "Detection method is not selected!");
}

Rect[] facesArray = faces.toArray();

if ((facesArray.length>0) && (faceState==SEARCHING))
{
Mat m=new Mat();
m=mGray.submat(facesArray[0]);
mBitmap = Bitmap.createBitmap(m.width(),m.height(), Bitmap.Config.ARGB_8888);


Utils.matToBitmap(m, mBitmap);
Message msg = new Message();
String textTochange = "IMG";
msg.obj = textTochange;
//mHandler.sendMessage(msg);

textTochange = fr.predict(m);
mLikely=fr.getProb();
msg = new Message();
msg.obj = textTochange;
mHandler.sendMessage(msg);

}
for (int i = 0; i < facesArray.length; i++)
Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);

return mRgba;
}

@Override
protected void onResume() {
super.onResume();
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}

@Override
protected void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}

@Override
protected void onDestroy() {
super.onDestroy();
mOpenCvCameraView.disableView();
}

// because capitalize is the new black
private String capitalize(final String line) {
return Character.toUpperCase(line.charAt(0)) + line.substring(1);
}
}
mOpenCvCameraView = findViewById(R.id.tutorial3_activity_java_surface_view);