Skip to content
This repository was archived by the owner on Jun 18, 2024. It is now read-only.

Port lib to android studio 3.2.1. Release image buffer as soon as possible in lib #31

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Release image buffer as soon as possible in lib
  • Loading branch information
tomsang committed Dec 14, 2018
commit 86f461155196ae29186c04854cbbb7f1b433cc8a
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ public Eyes getEyes(Mat img){
Mat leftHalfImg = img.submat(leftHalf);
leftEyeDetector.detectMultiScale(leftHalfImg, leftEyes);

rightHalfImg.release();
leftHalfImg.release();
if (rightEyes.empty() || leftEyes.empty() || rightEyes.toArray().length > 1 || leftEyes.toArray().length > 1){
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.media.FaceDetector;
import android.util.Log;

import org.opencv.android.Utils;
import org.opencv.core.Core;
Expand Down Expand Up @@ -84,9 +85,11 @@ public void setFaces(PreProcessorFactory.PreprocessingMode preprocessingMode) {

if (preprocessingMode == PreProcessorFactory.PreprocessingMode.RECOGNITION && preferencesHelper.getDetectionMethod()){
// Change the image rotation to the angle where the face was detected
images.remove(0);
Mat img = images.remove(0);
images.add(faceDetection.getImg());
setImages(images);
if(img != faceDetection.getImg()) {
img.release();
}
}
}

Expand Down Expand Up @@ -141,4 +144,26 @@ public void setImg(Mat img) {
public void normalize0255(Mat norm){
Core.normalize(norm, norm, 0, 255, Core.NORM_MINMAX, CvType.CV_8UC1);
}

//Release images
public void releaseImages() {
if (images == null || images.size() == 0)
return;
try {
for (int i = 0; i < images.size(); i++) {
if (images.get(i) != null) {
images.get(i).release();
} else {
Log.e("PreProcessor","releaseImages null image(" + i + "/" + images.size() +")");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
images.clear();
images = null;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ public class PreProcessorFactory {
public enum PreprocessingMode {DETECTION, RECOGNITION};
private PreProcessor preProcessorRecognition;
private PreProcessor preProcessorDetection;
private List<Mat> images;
public CommandFactory commandFactory;
private FaceDetection faceDetection;
private boolean eyeDetectionEnabled;
Expand All @@ -72,24 +71,32 @@ public PreProcessorFactory(Context context) {
public List<Mat> getCroppedImage(Mat img){
preProcessorDetection = new PreProcessor(faceDetection, getCopiedImageList(img), context);
List<String> preprocessingsDetection = getPreprocessings(PreferencesHelper.Usage.DETECTION);
images = new ArrayList<Mat>();
ArrayList<Mat> images = new ArrayList<Mat>();
images.add(img);
preProcessorRecognition = new PreProcessor(faceDetection, images, context);

try {
preprocess(preProcessorDetection, preprocessingsDetection);
preProcessorRecognition.setFaces(PreprocessingMode.RECOGNITION);
if(preProcessorRecognition.getFaces() == null || preProcessorRecognition.getFaces().length == 0) {
Log.d("getCroppedImage", "No face detected");
return null;
}

preProcessorRecognition = commandFactory.executeCommand(resources.getString(R.string.crop), preProcessorRecognition);
if (eyeDetectionEnabled) {
Eyes[] eyes = preProcessorRecognition.setEyes();
if (eyes == null || eyes[0] == null){
preProcessorRecognition.releaseImages();
return null;
}
}
preProcessorRecognition.setImages(Resize.preprocessImage(preProcessorRecognition.getImages(), preferencesHelper.getFaceSize()));
} catch (NullPointerException e){
Log.d("getCroppedImage", "No face detected");
return null;
} finally {
preProcessorDetection.releaseImages();
}
return preProcessorRecognition.getImages();
}
Expand All @@ -98,21 +105,28 @@ public List<Mat> getProcessedImage(Mat img, PreprocessingMode preprocessingMode)

preProcessorDetection = new PreProcessor(faceDetection, getCopiedImageList(img), context);

images = new ArrayList<Mat>();
ArrayList<Mat> images = new ArrayList<Mat>();
images.add(img);
preProcessorRecognition = new PreProcessor(faceDetection, images, context);

try {
preprocess(preProcessorDetection, getPreprocessings(PreferencesHelper.Usage.DETECTION));

preProcessorDetection.setFaces(preprocessingMode);

if(preProcessorDetection.getFaces()==null || preProcessorDetection.getFaces().length == 0) {
preProcessorDetection.releaseImages();
return null;
}
preProcessorRecognition.setFaces(preProcessorDetection.getFaces());
preProcessorRecognition.setAngle(preProcessorDetection.getAngle());
preProcessorRecognition = commandFactory.executeCommand(resources.getString(R.string.crop), preProcessorRecognition);

if (eyeDetectionEnabled) {
Eyes[] eyes = preProcessorRecognition.setEyes();
if (eyes == null || eyes[0] == null){
preProcessorDetection.releaseImages();
preProcessorRecognition.releaseImages();
return null;
}
}
Expand All @@ -122,12 +136,14 @@ public List<Mat> getProcessedImage(Mat img, PreprocessingMode preprocessingMode)
}

} catch (NullPointerException e){
preProcessorDetection.releaseImages();
Log.d("getProcessedImage", "No face detected");
return null;
}
if (preprocessingMode == PreprocessingMode.DETECTION){
return preProcessorDetection.getImages();
} else {
preProcessorDetection.releaseImages();
return preProcessorRecognition.getImages();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ public boolean train() {

@Override
public String recognize(Mat img, String expectedLabel) {
return rec.recognize(getFeatureVector(img), expectedLabel);
Mat feature = getFeatureVector(img);
String str = rec.recognize(feature, expectedLabel);
feature.release();
return str;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public String recognize(Mat img, String expectedLabel) {
img = getFeatureVector(img);
addImage(img, expectedLabel, true);
nearest = knn.findNearest(img,k,result);

img.release();
return labelMap.getKey((int) nearest);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,10 @@ public boolean train() {

@Override
public String recognize(Mat img, String expectedLabel) {
return rec.recognize(getFeatureVector(img), expectedLabel);
Mat feature = getFeatureVector(img);
String str = rec.recognize(feature, expectedLabel);
feature.release();
return str;
}

@Override
Expand Down