用眼镜找到眼睛 OpenCv

Posted

技术标签:

【中文标题】用眼镜找到眼睛 OpenCv【英文标题】:Find eyes with glasses OpenCv 【发布时间】:2012-03-14 00:40:20 【问题描述】:

我有这个问题,当我尝试使用适用于 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。 谁能帮帮我?? 提前致谢。

【问题讨论】:

您的代码是否适用于不戴眼镜的眼睛的 haar 分类器? 是的,不戴眼镜也能很好地工作。为什么?你能帮帮我吗? 【参考方案1】:

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

您可以train a new cascade(劳动密集型)或四处寻找其他人训练过的级联for this case。

【讨论】:

这确实是opencv中人脸/眼睛检测的问题。我们依赖于分类器的训练方式【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

这里有一些例子。


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


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


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

【讨论】:

以上是关于用眼镜找到眼睛 OpenCv的主要内容,如果未能解决你的问题,请参考以下文章

电脑如何显示密码框的小眼睛?

Win10登录框如何去掉“小眼睛”

如何找到面部形状和点来修复眼镜[重复]

百度登录框中,眼睛效果,和提示文字效果怎么产生?

视力保护找亿视康,亿视康教你保护眼睛的8种方式

帮你的眼睛推开“玻璃窗”,全世界都看“这里”!