2

我有这个问题,当我尝试使用适用于 android 的 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。
任何人都可以帮助我吗?
提前致谢。

4

3 回答 3

4

我没有玩过OpenCV的Android实现,但我用的是普通版。如果您的代码适用于眼睛的 Haar 级联而不是戴眼镜的级联,那让我怀疑用 openCV 打包的眼睛+眼镜级联不是很好。我在尝试区分正面和侧面时遇到了同样的问题。

您可以训练一个新的级联(这是劳动密集型的),也可以四处寻找其他人为此案例训练的级联。

于 2012-02-23T19:51:41.187 回答
2

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

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

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

这里有一些例子。


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

没有眼镜,OpenCV 可以很好地检测到人脸


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

显示器上白色表格的眩光现在阻止 OpenCV 检测到人脸


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

旋转网络摄像头

于 2012-05-25T23:51:03.697 回答
2

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

于 2012-02-24T09:29:56.910 回答