【发布时间】:2016-09-06 06:58:10
【问题描述】:
我有一些代码可以让我在实时摄像头预览中检测人脸,并使用 Google 提供的 play-services-vision 库在他们的地标上绘制一些 GIF。
当人脸静止时效果很好,但当人脸以中等速度移动时,人脸检测器需要比相机的帧速率更长的时间来检测人脸新位置的地标。我知道这可能与位图绘制速度有关,但我采取了一些措施来尽量减少其中的延迟。
(基本上我会抱怨 GIF 的重新定位不够“流畅”)
编辑:我确实尝试过获取坐标检测代码...
List<Landmark> landmarksList = face.getLandmarks();
for(int i = 0; i < landmarksList.size(); i++)
{
Landmark current = landmarksList.get(i);
//canvas.drawCircle(translateX(current.getPosition().x), translateY(current.getPosition().y), FACE_POSITION_RADIUS, mFacePositionPaint);
//canvas.drawCircle(current.getPosition().x, current.getPosition().y, FACE_POSITION_RADIUS, mFacePositionPaint);
if(current.getType() == Landmark.LEFT_EYE)
{
//Log.i("current_landmark", "l_eye");
leftEyeX = translateX(current.getPosition().x);
leftEyeY = translateY(current.getPosition().y);
}
if(current.getType() == Landmark.RIGHT_EYE)
{
//Log.i("current_landmark", "r_eye");
rightEyeX = translateX(current.getPosition().x);
rightEyeY = translateY(current.getPosition().y);
}
if(current.getType() == Landmark.NOSE_BASE)
{
//Log.i("current_landmark", "n_base");
noseBaseY = translateY(current.getPosition().y);
noseBaseX = translateX(current.getPosition().x);
}
if(current.getType() == Landmark.BOTTOM_MOUTH) {
botMouthY = translateY(current.getPosition().y);
botMouthX = translateX(current.getPosition().x);
//Log.i("current_landmark", "b_mouth "+translateX(current.getPosition().x)+" "+translateY(current.getPosition().y));
}
if(current.getType() == Landmark.LEFT_MOUTH) {
leftMouthY = translateY(current.getPosition().y);
leftMouthX = translateX(current.getPosition().x);
//Log.i("current_landmark", "l_mouth "+translateX(current.getPosition().x)+" "+translateY(current.getPosition().y));
}
if(current.getType() == Landmark.RIGHT_MOUTH) {
rightMouthY = translateY(current.getPosition().y);
rightMouthX = translateX(current.getPosition().x);
//Log.i("current_landmark", "l_mouth "+translateX(current.getPosition().x)+" "+translateY(current.getPosition().y));
}
}
eyeDistance = (float)Math.sqrt(Math.pow((double) Math.abs(rightEyeX - leftEyeX), 2) + Math.pow(Math.abs(rightEyeY - leftEyeY), 2));
eyeCenterX = (rightEyeX + leftEyeX) / 2;
eyeCenterY = (rightEyeY + leftEyeY) / 2;
noseToMouthDist = (float)Math.sqrt(Math.pow((double)Math.abs(leftMouthX - noseBaseX), 2) + Math.pow(Math.abs(leftMouthY - noseBaseY), 2));
...在 View draw 方法中的一个单独线程中,但它只是给我一个 SIGSEGV 错误。
我的问题:
- 在这种情况下,将人脸检测器的处理速度与相机预览帧速率同步是正确的做法,还是相反,还是其他方式?
- 当人脸检测器在相机预览帧中找到人脸时,我是否应该在 FD 完成之前丢弃预览提供的帧?如果是这样,我该怎么做?
- 我是否应该在相机预览中仅使用
setClassificationMode(NO_CLASSIFICATIONS)和setTrackingEnabled(false)以加快检测速度? - play-services-vision 库是否使用 OpenCV,实际上哪个更好?
编辑 2:
我读过一篇研究论文,使用 OpenCV,OpenCV 中可用的人脸检测和其他功能在 Android 中更快,因为它们具有更高的处理能力。我想知道我是否可以利用它来加速人脸检测。
【问题讨论】:
-
你们能帮忙解决这个问题吗? stackoverflow.com/questions/45141098/…
标签: android performance camera face-detection