我们需求是实时获取人与屏幕之间的距离,并实时提示用户保持距离,避免伤眼睛,以此为开发点实现功能。
用到的技术点:
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)
}
}
网友评论