美文网首页
Android根据人脸图片计算与镜头的距离(附Demo)

Android根据人脸图片计算与镜头的距离(附Demo)

作者: 光芒121 | 来源:发表于2023-08-22 17:44 被阅读0次

我们需求是实时获取人与屏幕之间的距离,并实时提示用户保持距离,避免伤眼睛,以此为开发点实现功能。

用到的技术点:

1、MLKIT (https://developers.google.cn/ml-kit/vision/face-detection?hl=en)检测是否有人脸和获取坐标
2、AndroidX camera PreviewView 库

计算原理:

使用Google的 MLKit获取到人脸特征点坐标根据人眼瞳距间的间隔计算出距离,计算方式如下:

注意:由于小孩和成年人,成年人与成年人之间获取到的都不相同,但相差不会太大,可以设置一个阈值作为判断条件,返回的值越大说明屏幕与人之间间隔越近,值越小说明间隔越远。如果没有检测到人脸说明照片中没有人物特征点。

override fun onSuccess(results: List<Face>, graphicOverlay: GraphicOverlay) {
        if (results.isNotEmpty()) {
            for (face in results) {
                val allContours = face.allContours
                val eyes = allContours.filter {
                    it.points.size == 16
                }
                if (eyes.isNotEmpty()) {
                    val leftPoint = eyes[0].points
                    val rightPoint = eyes[1].points

                    val leftEyePoint = leftPoint[0]
                    val rightEyePoint = rightPoint[0]

                    val value =
                        (leftEyePoint.x - rightEyePoint.x) * (leftEyePoint.x - rightEyePoint.x) + (leftEyePoint.y - rightEyePoint.y) * (leftEyePoint.y - rightEyePoint.y)

                    if (value > 0) {
                        val radius = sqrt(value.toDouble())
                        if (radius > 0) {   //返回根据图片流测得的人物与摄像头的距离
                            LiveEventBus.get<Int>("FACE_NUM").post(radius.toInt())
                        }
                    }
                }
            }
        } else {    //没有检测到人脸
            LiveEventBus.get<Int>("FACE_IS_EMPTY").post(results.size)
        }
    }

Demo地址:https://gitee.com/shao_g/test-pose.git

相关文章

网友评论

      本文标题:Android根据人脸图片计算与镜头的距离(附Demo)

      本文链接:https://www.haomeiwen.com/subject/bbeumdtx.html