2017-06-08 48 views
0

我想在android中使用相机检测人脸。 我使用openCV3.1 lib进行人脸检测。我发现一篇关于这个主题的文章HERE,我试图实现它,但我不知道为什么我的代码不工作,但它并没有显示任何错误。下面是我的代码。在android中使用openCV实时人脸检测

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); 
} 

有人能告诉我我哪里错了吗? 或者,是否还有其他关于使用openCV进行人脸检测的教程?

任何帮助,将不胜感激!

回答

0

正如您在前面提到的那样,您正在使用的是OpenCVLibrary的3.1.1的但是,你已经下面提到的版本是2.4.6

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

而是使用,

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