Библиотека распознавания лиц [закрывается]

Можно ли проверить, доступны ли текущие SD-карты, а какие нет, и как-то попросить пользователя получить разрешение на них?

Есть 3 части, чтобы это: обнаружение, какие карты есть, проверка, установлена ​​ли карта, и запрос доступа.

Если производители устройств - хорошие парни, вы можете получить список «внешнего» хранилища, вызвав getExternalFiles с аргументом null (см. Соответствующий javadoc).

1142 Они не могут быть хорошими парнями. И не у всех есть самая новая, самая горячая, без ошибок версия ОС с регулярными обновлениями. Поэтому могут быть некоторые каталоги, которые там не перечислены (например, USB-накопитель OTG и т. Д.). В случае сомнений вы можете получить полный список монтирований ОС из файла /proc/self/mounts. Этот файл является частью ядра Linux, его формат задокументирован здесь . Вы можете использовать содержимое /proc/self/mounts в качестве резервной копии: проанализировать его, найти пригодные для использования файловые системы (fat, ext3, ext4 и т. Д.) И удалить дубликаты с выводом getExternalFilesDirs. Предложите оставшиеся опции пользователям под некоторым ненавязчивым именем, что-то вроде «разных каталогов». Это даст вам все возможное внешнее, внутреннее, любое хранилище.


РЕДАКТИРОВАТЬ : после того, как я дал совет выше, я наконец попытался следовать ему сам. До сих пор все работало нормально, но имейте в виду, что вместо /proc/self/mounts вам лучше разбирать /pros/self/mountinfo (первый по-прежнему доступен в современном Linux, но позже это лучшая, более надежная замена). Также убедитесь, что учли проблемы атомарности , когда делали предположения на основе содержимого списка монтирований.


Вы можете наивно проверить, является ли каталог доступным для чтения / записи, вызывая canRead и canWrite . Если это удастся, нет смысла делать дополнительную работу. Если это не так, у вас либо есть постоянное разрешение Uri, либо нет.

«Получение разрешения» - ужасная часть. AFAIK, нет никакого способа сделать это в рамках инфраструктуры SAF. Intent.ACTION_PICK звучит как что-то, что может работать (поскольку он принимает Uri, из которого можно выбирать), но это не так. Возможно, это можно считать ошибкой, о чем следует сообщать трекеру ошибок Android как таковому.

Учитывая файл / путь к файлу, можно ли просто запросить разрешение на доступ к нему (и проверить, было ли оно передано ранее) или его корневой путь?

Вот для чего ACTION_PICK. Опять же, сборщик SAF не поддерживает ACTION_PICK из коробки. Сторонние файловые менеджеры могут, но очень немногие из них фактически предоставят вам реальный доступ. Вы также можете сообщить об этом как об ошибке, если захотите.


РЕДАКТИРОВАТЬ : этот ответ был написан до выхода Android Nougat. Что касается API 24, все еще невозможно запросить детальный доступ к определенному каталогу, но по крайней мере вы можете динамически запрашивать доступ ко всему тому: определите том , содержащий файл, и запросите доступ используя либо getAccessIntent с аргументом null (для вторичных томов), либо запрашивая разрешение WRITE_EXTERNAL_STORAGE (для основного тома).


Существует ли официальный способ преобразования между документами DocumentFile и реальными путями? Я нашел этот ответ, но в моем случае он разбился, к тому же он выглядит хакерским.

Нет. Никогда. Вы навсегда останетесь подчиненными прихотям создателей Storage Access Framework! злой смех

На самом деле, есть гораздо более простой способ: просто откройте Uri и проверьте расположение файловой системы созданного дескриптора (для простоты, версия только для Lollipop):

public String getFilesystemPath(Context context, Uri uri) {
  ContentResolver res = context.getContentResolver();

  String resolved;
  try (ParcelFileDescriptor fd = res.openFileDescriptor(someSafUri, "r")) {
    final File procfsFdFile = new File("/proc/self/fd/" + fd.getFd());

    resolved = Os.readlink(procfsFdFile.getAbsolutePath());

    if (TextUtils.isEmpty(resolved)
          || resolved.charAt(0) != '/'
          || resolved.startsWith("/proc/")
          || resolved.startsWith("/fd/"))
    return null;
  } catch (Exception errnoe) {
    return null;
  }
}

Если описанный выше метод возвращает местоположение, вам все еще нужен доступ, чтобы использовать его с File. Если он не возвращает местоположение, рассматриваемый Uri не ссылается на файл (даже временный). Это может быть сетевой поток, канал Unix, что угодно. Вы можете получить версию метода выше для более старых версий Android из этого ответа . Он работает с любым Uri, любым ContentProvider - не только SAF - до тех пор, пока Uri можно открыть с помощью openFileDescriptor (например, это из Intent.CATEGORY_OPENABLE).

Обратите внимание, что вышеуказанный подход можно считать официальным, если вы рассматриваете какую-либо часть официального API Linux как таковую. Многие программы для Linux используют его, и я также видел, что он используется в некотором коде AOSP (например, в тестах Launcher3).


РЕДАКТИРОВАТЬ : Android Nougat представил ряд изменений безопасности , прежде всего изменения в разрешениях частных каталогов приложений. Это означает, что, начиная с API 24, приведенный выше фрагмент кода будет всегда завершаться с ошибкой, когда Uri ссылается на файл в частном каталоге приложения. Это так, как задумано: от вас больше не ожидается, что вы узнаете этот путь вообще . Даже если вы каким-либо образом определите путь к файловой системе, вы не сможете получить доступ к файлам по этому пути. Даже если другое приложение сотрудничает с вами и изменяет разрешение файла на доступное для чтения, вы все равно не сможете получить к нему доступ. Это потому, что Linux не разрешает доступ к файлам, если у вас нет доступа для поиска к одному из каталогов в пути . Таким образом, получение файлового дескриптора от ContentProvider является единственным способом доступа к ним.


Можно ли использовать обычный API-интерфейс файла вместо API-интерфейса DocumentFile после получения разрешения?

Вы не можете. По крайней мере, на нуге. Обычный файловый API отправляется в ядро ​​Linux за разрешениями. Согласно ядру Linux, ваша внешняя SD-карта имеет ограниченные разрешения, которые не позволяют вашему приложению использовать ее. Разрешения, предоставляемые Storage Access Framework, управляются SAF (IIRC хранится в некоторых XML-файлах ), и ядро ​​ничего о них не знает. Вы должны использовать промежуточную сторону (Storage Access Framework), чтобы получить доступ к внешнему хранилищу. Обратите внимание, что ядро ​​Linux имеет собственный механизм управления доступом к поддеревам каталогов (он называется bind-mounts ), но создатели Storage Access Framework либо не знают об этом, либо не хотят его использовать. .

Вы можете получить некоторую степень доступа (почти все, что можно сделать с помощью File) с помощью файлового дескриптора, созданного из Uri. Я рекомендую вам прочитать этот ответ , он может содержать некоторую полезную информацию об использовании файловых дескрипторов в целом и по отношению к Android.

165
задан hippietrail 29 July 2013 в 00:09
поделиться

8 ответов

Вот список коммерческих поставщиков, которые предоставляют готовые пакеты для распознавания лиц, работающие в Windows:

  1. Cybula - Информация об их SDK для распознавания лиц . Это компания, основанная профессором университета, и поэтому их веб-сайт выглядит непрофессионально. Нет информации о ценах или демонстрации, которую вы можете скачать. Для получения информации о ценах свяжитесь с ними .

  2. NeuroTechnology - информация об их SDK для распознавания лиц . У этой компании есть предварительная информация о ценах , а также фактическая 30-дневная пробная версия своего SDK .

  3. Pittsburgh Pattern Recognition - ( Получено Google ) Информация об их SDK для отслеживания и распознавания лиц . Предоставляемые ими демонстрации помогут вам оценить их технологию, но не SDSK. Вам нужно связаться с ними для получения информации о ценах.

  4. Sensible Vision - Информация об их SDK . На их сайте вы можете легко получить ценовое предложение, а также заказать оценочный комплект, который поможет вам оценить их технологию.

82
ответ дан 23 November 2019 в 21:10
поделиться

Мы используем OpenCV . Там также есть много вещей, не связанных с распознаванием лиц, но, будьте уверены, он действительно распознает лица.

4
ответ дан 23 November 2019 в 21:10
поделиться

Я бы подумал Eigenface , которым вы являетесь если вы хотите рассчитать расстояние между гранями, это лучший вариант. Вы можете попробовать различные подходы, такие как Машина опорных векторов или Скрытая марковская модель . Я нашел страницу, на которой перечислены основные алгоритмы, которые можно использовать для распознавания лиц: Домашняя страница распознавания лиц .

Кроме того, когда вы говорите «лучшая производительность,

13
ответ дан 23 November 2019 в 21:10
поделиться

Следующим шагом будет FisherFaces. Попробуйте и проверьте, подходят ли они вам. Вот - хорошее сравнение.

0
ответ дан 23 November 2019 в 21:10
поделиться

If your project is on a movie or TV, or anything that has a script, it looks like you definitely want to look at the work of Mark Everingham et al.. The software is available, as are the results on a Buffy episode.

9
ответ дан 23 November 2019 в 21:10
поделиться

Не совсем то, что вы ищете, но может быть вам полезно. Алгоритмы распознавания лиц / компьютерного зрения в MATLAB.

0
ответ дан 23 November 2019 в 21:10
поделиться

pam-face-authentication Модуль PAM для аутентификации по лицу: но для получения того, что вы хотите, потребуется некоторая работа. Быстрый тест показал, что скорость распознавания не так хороша, как у VeriLook от NeuroTechnology.

Malic - еще одна программа для распознавания лиц с открытым исходным кодом, которая использует дескрипторы Gabor Wavelet. Но последнему обновлению первоисточника 3 года.

С сайта: " Malic - это программное обеспечение для распознавания лиц с открытым исходным кодом, которое использует вейвлет Габора. Это система распознавания лиц в реальном времени, основанная на системе оценки идентификации лиц Malib и CSU (csuFaceIdEval). Использует библиотеку Malib для обработки изображений в реальном времени и некоторые из csuFaceIdEval для распознавания лиц . "

В дальнейшем это может быть интересно:

gaborboosting : Научная программа, применяемая для распознавания лиц с помощью вейвлета Габора и алгоритма AdaBoost.

Библиотека извлечения признаков - FELib относится к «Аннотации лиц с помощью дискриминанта Фишера с трансдуктивным ядром»,

19
ответ дан 23 November 2019 в 21:10
поделиться
-

Я знаю, что это было некоторое время, но для тех, кто заинтересован, есть Finc проект, который составлял много из этих функций (обнаружение, распознавание и т. Д. ,) в хороший программный пакет.

5
ответ дан 23 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: