- Новый ARCore Augmented Faces API , который работает на фронтальной камере без датчика глубины, предлагает высококачественную
468-point
3D-сетку, которая позволяет пользователям добавлять такие эффекты на их лица в виде анимированных масок, очков, ретуши кожи и т. д. Сетка предоставляет координаты и привязки к региону , которые позволяют добавлять эти эффекты.Я твердо верю, что обнаружение лицевых ориентиров генерируется с помощью алгоритмов компьютерного зрения под капотом ARCore 1.7 . Также важно сказать, что вы можете начать работу в Unity или в Sceneform, создав сеанс ARCore с включенным режимом «фронтальная камера» и «Расширенные грани». Обратите внимание, что другие функции AR, такие как определение плоскости, в настоящее время недоступны при использовании фронтальной камеры.
blockquote>AugmentedFace
расширяетTrackable
, поэтому лица обнаруживаются и обновляются точно так же, как плоскости, дополненные изображения и другие отслеживаемые объекты .Как вы знаете, 2+ года назад Google выпустила
blockquote>Face API
, которая выполняет обнаружение лица, которое находит лица в фотографии, а также их положение (где они на картинке) и ориентация (в какую сторону они смотрят, относительно камеры). API Face позволяет вам определять ориентиры (точки интереса на лице) и выполнять классификацию, чтобы определить, являются ли глаза открытыми или закрытыми, и является ли лицо улыбающимся. Face API также обнаруживает и отслеживает лица в движущихся изображениях, что называется отслеживанием лиц.Итак, ARCore 1.7 только что позаимствовал некоторые архитектурные элементы из Face API, и теперь он не только обнаруживает лицевые ориентиры и генерирует для них 468 точек, но и отслеживает их в в режиме реального времени со скоростью 60 кадров в секунду и придерживается трехмерной геометрии лица .
См. Google Обзор концепций распознавания лиц .
Рассчитать канал глубины в видео, снятом движущейся RGB-камерой, не является ракетостроением. Вам просто нужно применить формулу параллакса к отслеживаемым функциям. Таким образом, если амплитуда трансляции объекта на статическом объекте достаточно высока - отслеживаемый объект находится ближе к камере, а если амплитуда объекта на статическом объекте достаточно низкая - отслеживаемый объект находится дальше от камеры. Эти подходы для расчета глубинного канала вполне обычны для таких приложений композитинга, как The Foundry NUKE и Blackmagic Fusion более 10 лет. Теперь те же принципы доступны в ARCore.
Вы не можете отклонить алгоритм обнаружения / отслеживания лиц для пользовательского объекта или другой части тела, например руки. API Augmented Faces разработан только для лиц.
Вот как выглядит Java-код для активации функции Augmented Faces:
// Create ARCore session that supports Augmented Faces public Session createAugmentedFacesSession(Activity activity) throws UnavailableException { // Use selfie camera Session session = new Session(activity, EnumSet.of(Session.Feature.FRONT_CAMERA)); // Enabling Augmented Faces Config config = session.getConfig(); config.setAugmentedFaceMode(Config.AugmentedFaceMode.MESH3D); session.configure(config); return session; }
Затем получите список обнаруженных лиц:
Collection
faceList = session.getAllTrackables(AugmentedFace.class); И, наконец, рендеринг эффекта :
for (AugmentedFace face : faceList) { // Create a face node and add it to the scene. AugmentedFaceNode faceNode = new AugmentedFaceNode(face); faceNode.setParent(scene); // Overlay the 3D assets on the face faceNode.setFaceRegionsRenderable(faceRegionsRenderable); // Overlay a texture on the face faceNode.setFaceMeshTexture(faceMeshTexture); // ....... }
Надеюсь, это поможет.
Из MSDN :
Если операция завершена успешно и его результат назначается в обработчике событий DoWork, вы можете получить доступ к результату через RunWorkerCompletedEventArgs.Result свойство.
и :
Ваш обработчик событий RunWorkerCompleted. всегда следует проверять ошибку и Отмененные свойства до доступа Свойство Result. Если исключение был поднят или если операция была отменено, доступ к Результату свойство вызывает исключение.
Так что, если оно не завершится успешно (то есть вы отмените его), похоже, что это не сработает. Может быть, подумайте о возврате сведений об отмене в качестве результата (как успеха) для случая прерывания, обнаружив разницу в обработчике завершения?
Скорее всего, потому что код отменяет работу, а не завершает ее. Поэтому попробуйте получить доступ к результату в ветке if (! E.Cancel).
Свойство Результат
предназначено для представления результата завершенной операции. Вы установили для параметра Отмена
значение true, что означает, что операция была отменена, поэтому результата не должно быть.
Похоже, вы должны закодировать «Я прервал, потому что что-то пошло не так» в свой result, или выбросить исключение, которое будет установлено как свойство Error
в результате - Отмена
предназначена для установки, если рабочий заметил, что вызов был отменен извне.
В документации для RunWorkerCompletedEventArgs.Result
указано:
Ваш обработчик событий RunWorkerCompleted всегда следует проверять ошибку и Отмененные свойства до доступа Свойство Result. Если исключение был поднят или если операция была отменено, доступ к Результату свойство вызывает исключение.
В части документации «Исключения» также указано, что оно вызовет исключение, если Cancelled
истинно.