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にパッケージ化されたeyes+glassesカスケードはあまり良くないのではないかと思います。正面と側面を区別しようとしても同じ問題が発生しました。

新しいカスケード(これは労働集約的です)をトレーニングするか、他の人がこのケースのためにトレーニングしたカスケードを探し回ることができます。

于 2012-02-23T19:51:41.187 に答える
2

私も、OpenCVWindowsクライアントで眼鏡をかけている人が見えないという同様の問題を抱えていました。数日間の調査とデバッグの結果、モニター自体(および私の大きな白いフォーム)から生成されたグレアが問題の原因であると最終的に判断しました。このまぶしさは、OpenCVが顔をIDするどころか、顔を検出することさえ妨げていました。なんでこれ?OpenCVが目を見ることができない場合、顔を見ることができません。

はるかに小さいAndroid画面がこれと同じ問題を引き起こしている可能性があるかどうかはわかりませんが、時間の価値があるかもしれません。

Haarケースについて...他の応答で参照されているものを含め、見つけたすべてのカスケードファイルを調べました。最高のファイルは、これまでのところ、haarcascade_frontalface_alt2.xmlです。私の環境とすべてのタイプの人々にとって、このファイルは断然最高です。

ここにいくつかの例があります。


眼鏡やOpenCVは私の顔をうまく検出できません:

眼鏡はなく、OpenCVは顔をうまく検出できません


モニターの白いフォームからのグレアにより、OpenCVが私の顔を検出できなくなりました。

モニターの白いフォームからのグレアにより、OpenCVが顔を検出できなくなりました


最後に、ウェブカメラを上に回転させた状態で、眼鏡にまぶしさはなく、OpenCVは私の顔をうまく検出できます。

回転したウェブカメラ

于 2012-05-25T23:51:03.697 に答える
2

haarcascade_mcs_eyepair_smallという名前のOpencv分類子は、メガネの有無にかかわらず、Androidプロジェクトで良い結果をもたらすことがわかりました。実際、1つの座標xとyを持つ2つの目が見つかりました。
これがお役に立てば幸いです...

于 2012-02-24T09:29:56.910 に答える