用眼镜OpenCv找眼睛

时间:2012-02-23 15:25:14

标签: android opencv classification eye-detection

我有这个问题,当我试图用openCv库找到戴眼镜的眼睛时我的代码不起作用。
我的代码如下:

         try {
            InputStream is = this.getResources().openRawResource(R.raw.haarcascade_eye_tree_eyeglasses);
            File cascadeDir = this.getDir("cascade"+"occhiOcchiali", Context.MODE_PRIVATE);
            File cascadeFile = new File(cascadeDir, "haarcascade_eye_tree_eyeglasses.xml");
            FileOutputStream os = new FileOutputStream(cascadeFile);
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = is.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            is.close();
            os.close();
            mioClassificatoreOcchiOcchiali = new CascadeClassifier(cascadeFile.getAbsolutePath());
            Log.d("metodo1", cascadeFile.getAbsolutePath());
            if (mioClassificatoreOcchiOcchiali.empty()) {
                Log.d("metodo1", "Failed to load cascade classifier");
                mioClassificatoreOcchiOcchiali = null;
            } else
                Log.d("metodo1", "Loaded cascade classifier from " + cascadeFile.getAbsolutePath());

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

        } catch (IOException e) {
            e.printStackTrace();
            Log.d("metodo1" , "Failed to load cascade. Exception thrown: " + e);
        }

通过这种方式,我拿走了我的分类器,用这个代码我试着用眼镜找到眼睛:

LinkedList<org.opencv.core.Rect> occhi = new LinkedList<org.opencv.core.Rect>();
                    org.opencv.core.Size sOcchi = new org.opencv.core.Size(15, 15);
                    mioClassificatoreOcchiOcchiali.detectMultiScale(matOcchi, occhi,1.1, 2,0,sOcchi);  

如果我离开眼镜,结果总是0,结果总是2 任何人都可以帮助我? 提前谢谢。

3 个答案:

答案 0 :(得分:4)

我没有使用OpenCV的Android实现,但我使用的是普通版本。如果你的代码适用于眼睛的Haar级联,而不是带眼镜的那个,这让我怀疑用openCV包装的眼睛+眼镜级别不是很好。试图区分正面和侧面时,我遇到了同样的问题。

您可以train a new cascade(这是劳动密集型的)或环顾其他人培训过的级联for this case

答案 1 :(得分:2)

我也遇到了类似的问题,我的OpenCV Windows客户端没有看到戴眼镜的人。经过几天的挖掘和调试后,我终于确定显示器本身(以及我的大白色形状)产生的眩光导致了问题。这种眩光阻止了OpenCV甚至检测到一张脸,更不用说ID了。这是为什么?如果OpenCV无法看到眼睛那么就看不到脸。

我不知道更小的Android屏幕是否会导致同样的问题,但它可能值得你花时间。

关于Haar cascases ...我浏览了我能找到的每个级联文件,包括其他响应中引用的文件。到目前为止,最好的文件是:haarcascade_frontalface_alt2.xml。对于我的环境和所有类型的人来说,这个文件是迄今为止最好的。

以下是一些例子。


没有眼镜和OpenCV可以很好地检测到我的脸:

No glasses and OpenCV can detect a face just fine


我的显示器上的白色形状的眩光现在阻止OpenCV检测到我的脸:

Glare from my white form on my monitor is now preventing OpenCV from detecting a face


最后,随着我的网络摄像头全部旋转,我的眼镜上没有眩光,OpenCV可以很好地检测到我的脸:

Rotated webcam

答案 2 :(得分:1)

我发现名为haarcascade_mcs_eyepair_small的Opencv分类器在有或没有眼镜的情况下在android项目中给出了很好的结果。事实上,它发现了一对眼睛有一个坐标x和y 希望这可能会有所帮助......