2017-06-08 2 views
0

J'essaie de détecter les visages en utilisant l'appareil photo dans Android. J'utilise openCV3.1 lib pour la détection de visage. J'ai trouvé un article sur ce sujet HERE, j'ai essayé de mettre en œuvre même mais je ne sais pas pourquoi mon code ne fonctionne pas, il ne montre aucune erreur si. ci-dessous est mon code.Détection de visage en temps réel en utilisant openCV dans android

public class OpenCVActivity extends Activity 
    implements CvCameraViewListener { 

private CameraBridgeViewBase openCvCameraView; 
private CascadeClassifier cascadeClassifier; 
private Mat grayscaleImage; 
private int absoluteFaceSize; 

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
       initializeOpenCVDependencies(); 
       break; 
      default: 
       super.onManagerConnected(status); 
       break; 
     } 
    } 
}; 

private void initializeOpenCVDependencies() { 

    try { 
     // Copy the resource into a temp file so OpenCV can load it 
     InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface); 
     File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); 
     File mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.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(); 

     // Load the cascade classifier 
     cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath()); 
    } catch (Exception e) { 
     Log.e("OpenCVActivity", "Error loading cascade", e); 
    } 

    // And we are ready to go 
    openCvCameraView.enableView(); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    openCvCameraView = new JavaCameraView(this, -1); 
    setContentView(openCvCameraView); 
    openCvCameraView.setCvCameraViewListener(this); 
} 

@Override 
public void onCameraViewStarted(int width, int height) { 
    grayscaleImage = new Mat(height, width, CvType.CV_8UC4); 

    // The faces will be a 20% of the height of the screen 
    absoluteFaceSize = (int) (height * 0.2); 
} 

@Override 
public void onCameraViewStopped() { 
} 

@Override 
public Mat onCameraFrame(Mat aInputFrame) { 
    // Create a grayscale image 
    Imgproc.cvtColor(aInputFrame, grayscaleImage, Imgproc.COLOR_RGBA2RGB); 

    MatOfRect faces = new MatOfRect(); 

    // Use the classifier to detect faces 
    if (cascadeClassifier != null) { 
     cascadeClassifier.detectMultiScale(grayscaleImage, faces, 1.1, 2, 2, 
       new Size(absoluteFaceSize, absoluteFaceSize), new Size()); 
    } 

    // If there are any faces found, draw a rectangle around it 
    Rect[] facesArray = faces.toArray(); 
    for (int i = 0; i <facesArray.length; i++) { 
     Log.i("face : ","Detected"); 
     Imgproc.rectangle(aInputFrame, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0, 255), 3); 
    } 

    return aInputFrame; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback); 
} 

Quelqu'un peut-il me dire où je vais mal? ou, Y at-il d'autres tutoriels disponibles sur cette détection de visage en utilisant openCV?

Toute aide serait appréciée!

Répondre

0

Comme vous l'avez mentionné précédemment, vous utilisez OpenCVLibrary de 3.1.1. Mais, la version que vous avez mentionné ci-dessous est pour 2.4.6

Par exemple: @Override public void onResume() { super.onResume(); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback); }

utiliser à la place,

public void onResume() { super.onResume(); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback); }