Найди глаза в очках OpenCv - PullRequest
2 голосов
/ 23 февраля 2012

У меня есть эта проблема, мой код не работает, когда я пытаюсь найти глаза в очках с библиотекой openCv для Android.
Мой код следующий:

         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 ]

4 голосов
/ 23 февраля 2012

Я не играл с реализацией Android OpenCV, но я использовал обычную версию.Если ваш код хорошо работает с каскадом Хаара для глаз, а не с каскадом очков, это заставляет меня подозревать, что каскад глаз + очки в комплекте с openCV не очень хорош.У меня была такая же проблема, когда я пытался провести различие между передней и боковой гранями.

Вы можете обучить новый каскад (который трудоемок) или посмотреть вокруг каскады, которые обучали другие люди для этого случая .

2 голосов
/ 26 мая 2012

У меня тоже была похожая проблема с моими клиентами OpenCV Windows, которые не видели людей в очках.После нескольких дней копания и отладки я, наконец, решил, что блики, генерируемые самим монитором (и моей большой белой формой), вызывают проблемы.Этот яркий свет мешал OpenCV даже обнаружить лицо, не говоря уже о том, чтобы идентифицировать его.Почему это было?Если OpenCV не может видеть глаза, то он не может видеть лицо.

Я не знаю, может ли намного меньший экран Android вызывать такую ​​же проблему или нет, но это может стоить вашего времени,

Что касается каскадов Хаара ... Я просмотрел каждый каскадный файл, который мог найти, включая файлы, на которые есть ссылки в других ответах.На данный момент лучшим файлом является: 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

1 голос
/ 24 февраля 2012

Я обнаружил, что классификатор Opencv с именем haarcascade_mcs_eyepair_small дает хороший результат в проекте Android в случае с очками и без них.На самом деле он нашел пару глаз с одной координатой x и y.
Надеюсь, это может быть полезно ...

...