【问题标题】:Android face detection MaxNumDetectedFacesAndroid人脸检测MaxNumDetectedFaces
【发布时间】:2012-03-23 14:25:03
【问题描述】:

所以我刚刚将我的平板电脑(原装华硕变压器)升级到 android 版本 4.0.3 以构建使用人脸检测的应用程序。但是每次我启动它并尝试开始人脸检测时,我都会在 logcat 中收到此错误:

E/AndroidRuntime(1755): java.lang.IllegalArgumentException: invalid face detection type=0

我在文档中读到这意味着可以检测或支持 0 个面孔,但这是否意味着我的设备根本无法检测到面孔,或者我可以更改什么?另外它使用后置摄像头,将其更改为另一个摄像头会改变什么吗?我一直在尝试这样做,但我不知道如何,我试图运行的项目可以在这里找到:

https://docs.google.com/open?id=0B2Nu5U2Cz81qZExGQ25sWVdRd21IOExUUTZsZzFoZw

来自这个 SO 问题: Android face detector using android camera

【问题讨论】:

标签: android


【解决方案1】:

请记住,您可以使用旧的 FaceDetector API 检测人脸。它从 API 级别 1 开始就已经存在,应该适用于所有带摄像头的手机。当检测到人脸时,它还会返回一个边界框。

public Rect findFace(Bitmap bmp) {
    // Ask for 1 face
    Face faces[] = new FaceDetector.Face[1];
    FaceDetector detector = new FaceDetector( bmp.getWidth(), bmp.getHeight(), 1 );
    int count = detector.findFaces( bmp, faces );

    Face face = null;

    if( count > 0 ) {
        face = faces[0];

        PointF midEyes = new PointF();
        face.getMidPoint( midEyes );
        Log.i( TAG,
                "Found face. Confidence: " + face.confidence() + ". Eye Distance: " + face.eyesDistance() + " Pose: ("
                        + face.pose( FaceDetector.Face.EULER_X ) + "," + face.pose( FaceDetector.Face.EULER_Y ) + ","
                        + face.pose( FaceDetector.Face.EULER_Z ) + "). Eye Midpoint: (" + midEyes.x + "," + midEyes.y + ")" );

        float eyedist = face.eyesDistance();
        PointF lt = new PointF( midEyes.x - eyedist * 2.0f, midEyes.y - eyedist * 2.5f );
        // Create rectangle around face.  Create a box based on the eyes and add some padding.
        // The ratio of head height to width is generally 9/5 but that makes the rect a bit to tall.
        return new Rect(
            Math.max( (int) ( lt.x ), 0 ),
            Math.max( (int) ( lt.y ), 0 ),
            Math.min( (int) ( lt.x + eyedist * 4.0f ), bmp.getWidth() ),
            Math.min( (int) ( lt.y + eyedist * 5.5f ), bmp.getHeight() )
        );
    }

    return null;
}

【讨论】:

    【解决方案2】:

    您应该首先调用 getMaxNumDetectedFaces() 来查看您的设备是否支持它。如果支持,则返回值应 > 0。就像我在上一个问题中提到的,设备摄像头模块和驱动程序也必须支持它。

    http://developer.android.com/reference/android/hardware/Camera.Parameters.html#getMaxNumDetectedFaces()

    【讨论】:

    • 如果最大面数为 0,与硬件有关吗?这意味着有什么方法可以在我的平板电脑上进行人脸检测,还是永远不受支持?
    • 是的,除非您的 OEM 在未来的版本中修补它,否则它将不受框架 API 的支持(通过实时预览进行面部检测)。有一些第三方工具包值得探索,即 OpenCV/JavaCV
    • @Anirudh 是否有任何官方网站可以证明设备摄像头模块和驱动程序也支持面部检测。提前致谢
    【解决方案3】:

    对于像我这样的人,

    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/media/FaceDetector.java

    查看链接中的代码,检查可能的异常(例如,输入位图大小与FaceDetection对象的初始大小不同会引发非法参数异常,第138行~)

    【讨论】:

      猜你喜欢
      • 2013-09-24
      • 1970-01-01
      • 2019-02-27
      • 2011-10-26
      • 2019-11-18
      • 2012-04-04
      • 2012-03-05
      • 2011-05-06
      • 1970-01-01
      相关资源
      最近更新 更多