У меня есть код, который позволяет мне обнаружить лица в предварительном просмотре в реальном времени и нарисовать несколько GIF-файлов над их ориентирами, используя библиотеку видения игровых услуг, предоставляемую Google.play-services-vision: Как синхронизировать скорость обнаружения лиц с частотой просмотра камеры?
Он работает достаточно хорошо, когда лицо статично, но когда лицо движется с умеренной скоростью, детектор лица занимает больше времени, чем частота кадров камеры, чтобы обнаружить ориентиры в новом положении лица. Я знаю, что это может иметь какое-то отношение к скорости рисования растровых изображений, но я сделал шаги, чтобы свести к минимуму задержку.
(В основном я получаю жалобы, что ГИФС репозиционирование не „достаточно гладкое“)
EDIT: Я попытаться получить координату кода обнаружения ...
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)
в предварительном просмотре камеры, чтобы ускорить обнаружение? - Использует ли библиотека просмотра игровых сервисов OpenCV, и что на самом деле лучше?
EDIT 2:
Я читал одну научно-исследовательскую работу, что, используя OpenCV, обнаружение лица и другие функции, доступные в OpenCV быстрее в Android из-за их более высокой мощности. Мне было интересно, могу ли я использовать это, чтобы ускорить обнаружение лица.
Можете ли вы, ребята, помочь в решении этой проблемы? https://stackoverflow.com/questions/45141098/google-vision-drawing-mask-on-face-with-animations –