2017-06-08 1 views
0

アンドロイドでカメラを使って顔を検出しようとしています。 私はopenCV3.1 libを顔検出に使用しています。私はこのトピックに関する記事を見つけました。HERE、私は同じように実装しようとしましたが、私のコードがうまくいかない理由を知っていません。以下は私のコードです。アンドロイドで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 of 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); }

関連する問題