使用两个级联分类器进行面部和眼睛检测

时间:2012-12-04 08:13:39

标签: java android

我很抱歉初学者的问题,但我没有找到答案。 我正试图实时检测脸部和眼睛。代码(在android openCV上运行)如果我只使用面部检测或仅使用眼睛检测就可以正常工作,但是当我将两者结合起来时,就像在附带的代码中一样,程序在运行时崩溃。我不确定如何组合这两个级联(一个在脸部周围显示一个矩形,另一个在眼睛周围显示)。任何帮助将不胜感激!

    InputStream is3 = context.getResources().openRawResource(R.raw.lbpcascade_frontalface);
        File cascadeDir = context.getDir("cascade", Context.MODE_PRIVATE);
        File cascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
        File cascadeFileEye = new File(cascadeDir, "eyes_detect.xml");
        FileOutputStream os = new FileOutputStream(cascadeFile);

        byte[] buffer = new byte[4096];
        int bytesRead;

        while ((bytesRead = is3.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
            }

        is3.close();
        os.close();
        FileOutputStream os1 = new FileOutputStream(cascadeFileEye);


        byte[] bufferEye = new byte[4096];
        int bytesReadEye;

        while ((bytesReadEye = is3.read(bufferEye)) != -1) {
            os1.write(bufferEye, 0, bytesReadEye);
            }

        is4.close();
        os1.close();

        mCascade = new CascadeClassifier(cascadeFile.getAbsolutePath());
        mCascadeEye = new CascadeClassifier(cascadeFileEye.getAbsolutePath());
        if (mCascade.empty()) {
            //Log.e(TAG, "Failed to load cascade classifier");
            mCascade = null;
            }  

        if (mCascadeEye.empty()) {
            //Log.e(TAG, "Failed to load cascade classifier");
            mCascadeEye = null;
            }  

        cascadeFile.delete();
        cascadeDir.delete();

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

你是不是错过了这一行

InputStream is3 = context.getResources().openRawResource(R.raw.eyes_detect);

你的Raw文件夹中也应该有文件eyes_detect.xml。

我使用了haarcascade_eye_tree_eyeglasses.xml,并且仅传递了检测到的脸部的裁剪区域以获取眼睛位置。