предисловие
В разработке интерфейса за последние несколько лет веб-приложения продолжали развиваться в направлении опыта Native APP, Например, наиболее обсуждаемый PWA в этом году, даже Apple постепенно интегрировала Service Worker в свое собственное браузерное сафари. При поддержке основных производителей браузеров возможности Интернета постепенно расширяются, в то же время с обновлением аппаратного обеспечения постепенно улучшается опыт работы с интерфейсными приложениями.
Однако во многих случаях по-прежнему требуется встроенная поддержка APP для аппаратных вызовов нижнего уровня и сложных операций, которые предоставляются для вызовов интерфейсных приложений в форме JSBridge в среде Webview. Это заставляет многие интерфейсные приложения полагаться только на веб-просмотр, настроенный Native APP. Конечно, производители браузеров также постоянно следят за ними, предоставляя множество базовых аппаратных интерфейсов и интерфейсов системного уровня непосредственно в Интернет, таких как Web Bluetooth API, Web Share API, Shape Detection API и так далее.
В этой статье я расскажу об API обнаружения фигур (Shape Detection API), интегрированном в Chrome.
распознавание образов
Фотографии и изображения составляют большую часть Интернета, и довольно многие из них содержат узнаваемые элементы, такие как лица, QR-коды или текст. Как вы можете себе представить, идентификация этих функций требует больших вычислительных ресурсов, но есть несколько интересных сценариев, таких как автоматическая пометка лиц на фотографиях или перенаправление на основе URL-адресов в изображениях. Производители аппаратного обеспечения уже давно поддерживают эти функции, но веб-приложения медленно используют преимущества этих аппаратных функций и вынуждены прибегать к некоторым сложным в использовании библиотекам для достижения своих целей.
Поскольку распознавание изображений требует ресурсов системного уровня и вычислительной мощности, с этим может справиться только собственный базовый API. В текущем веб-приложении, когда речь идет о функции распознавания изображений, изображение обычно загружается на сервер или передается в собственное приложение через JSBridge в веб-просмотре, и после вычисления результата оно возвращается в Интернет для продолжить обработку. Для Интернета его возможности слабы и должны полагаться на обработку на стороне сервера или JSBridge.Если обработка изображений может стать стандартным API Интернета, его возможности будут значительно улучшены.
В нативной разработке платформы Android и IOS напрямую предоставляют некоторые возможности для разработки приложений для распознавания изображений на системном уровне.Например, для распознавания QR-кода/штрих-кода Android может использоватьbarcode API, IOS можно использоватьCIQRCodeFeature API.
И почему не может быть набора стандартных js API для вызова базовых возможностей системы в веб-приложениях?
В 2016 году команда Chrome попыталась интегрировать API-интерфейс Shape Detection, напрямую предоставляемый в вызовы веб-разработки в браузере. В настоящее время API распознавания графики все еще находится в инкубационной и экспериментальной стадии в WICG.Если вы хотите включить эту функцию, вам необходимо скачать Canary-версию браузера Chrome (уууу. google.com/chrome/brow…), затем введите в адресную строкуchrome://flags/#enable-experimental-web-platform-features, нажмите «Включить» в функциях экспериментальной веб-платформы, чтобы включить экспериментальную функцию.
Затем проверьте, поддерживает ли браузер API, введите в консоли:
window.FaceDetector
window.BarcodeDetector
window.TextDetector
Если выходит LOG:
ƒ FaceDetector() { [native code] }
ƒ BarcodeDetector() { [native code] }
ƒ TextDetector() { [native code] }
Это означает, что вы уже можете вызывать API обнаружения формы в браузере.
Хотя API все еще находится в экспериментальной стадии (функции в экспериментальной стадии нестабильны, и, возможно, в конце концов он не будет формально интегрирован), мы, как фронтенд-разработчики новой эры, все еще готовы его опробовать.
СОВЕТ: необходимо загрузить следующие примерыКанарская версия Chrome, и включитеExperimental Web Platform featuresЭкспериментальная функция.
Возможности API
API обнаружения формы предоставляет три интерфейса для вызова:
- FaceDetector: распознавание лиц;
- BarcodeDetector: распознавание QR-кода/штрих-кода;
- TextDetector: распознавание текста;
1. Распознавание лиц
FaceDetector — низкоуровневый класс компонентов платформы ускорения для распознавания лиц на изображениях, он принимает конфигурационный параметр FaceDetectorOptions, мы напрямую создаем экземпляр FaceDetector:
const faceDetector = new FaceDetector({
fastMode: true,
maxDetectedFaces: 10
});
Параметры в FaceDetectorOptions:
- fastMode: [Boolean], указывающий, следует ли включить режим приоритета скорости (над точностью), который будет определяться меньшим масштабом (ближе к целевому графику) или путем нахождения большего целевого графика;
- maxDetectedFaces: [Number] — максимальное количество распознанных лиц в текущей сцене;
Класс FaceDetector имеет методdetect
, который принимает изображениеImage
илиBlob
объект, используемый для обнаружения лиц на этом изображении, и возвращаетPromise
Объект:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Shape Detection API Demo</title>
<style>
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<img
id="face-image"
src="//opsqe9du9.bkt.clouddn.com/1.jpeg" alt="image"
crossorigin="anonymous"
style="width: 100%;"
/>
<script type="text/javascript">
window.onload = main();
function main () {
const faceDetector = new FaceDetector({fastMode: true, maxDetectedFaces: 10});
const image = document.getElementById('face-image');
faceDetector.detect(image)
.then(detectedFaces => {
console.log(detectedFaces);
})
.catch((e) => {
console.error("Face Detection failed, boo.", e);
});
}
</script>
</body>
</html>
В приведенном выше примере: в HTML созданimg
Метка (здесь следует отметить одну вещь: если изображение происходит из междоменного домена, вам нужно установитьcrossorigin="anonymous"
), то получитеImage
объект, звонокfaceDetector.detect
для обнаружения лица на изображении и распечатки его после успешного распознаванияdetectedFaces
получать:
(5) [DetectedFace, DetectedFace, DetectedFace, DetectedFace, DetectedFace]
0: DetectedFace
boundingBox: DOMRect
bottom: 275
height: 44
left: 710
right: 754
top: 231
width: 44
x: 710
y: 231
landmarks: Array(3)
0:
location: {x: 729, y: 246}
type: "eye"
1: {location: {…}, type: "eye"}
2: {location: {…}, type: "mouth"}
length: 3
1: DetectedFace {boundingBox: DOMRect, landmarks: Array(3)}
2: DetectedFace {boundingBox: DOMRect, landmarks: Array(3)}
3: DetectedFace {boundingBox: DOMRect, landmarks: Array(3)}
4: DetectedFace {boundingBox: DOMRect, landmarks: Array(3)}
length: 5
Как видите, здесь было распознано 5 лиц, а возвращено одно.length === 5
Массив из , каждый элемент массива представляет собой объект DetectedFace, содержащий два свойства:
- boundingBox: объект DOMRect, который содержит информацию о положении (внизу, вверху, слева, справа, x, y) и размере (ширина, высота) области распознавания;
- ориентиры: это массив, который содержит некоторую информацию об особенностях его лица, такую как глаза (глаз), рот (рот) и информацию о его положении (x, y);
Полная демонстрация:Ищем в том же городе.GitHub.IO/Superstition-demo/…
2. Распознавание QR-кода/штрих-кода
BarcodeDetector — это низкоуровневый класс компонентов платформы ускорения, который распознает QR-коды или штрих-коды на изображениях, экземпляры которых мы создаем напрямую:
const barcodeDetector = new BarcodeDetector();
Как и FaceDetector, используйтеdetect
функцию обнаружения изображения, этот метод также принимаетImage
илиBlob
объект, возвращаяPromise
Объект:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Shape Detection API Demo</title>
<style>
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<img id="qrcode-image" crossorigin="anonymous" src="//opsqe9du9.bkt.clouddn.com/img-2.png" alt="QRCODE">
<script type="text/javascript">
window.onload = main;
function main () {
const barcodeDetector = new BarcodeDetector();
const image = document.getElementById('qrcode-image');
barcodeDetector.detect(image)
.then(detectedCodes => {
console.log(detectedCodes);
})
.catch((e) => {
console.error("Barcode Detection failed, boo.", e);
})
}
</script>
</body>
</html>
И ранее описанные примеры, обнаружение приобретенного печатиdetectedCodes
:
[DetectedBarcode]
0: DetectedBarcode
boundingBox: DOMRect
bottom: 375.4765348434448
height: 362.06744384765625
left: 9.409090042114258
right: 371.47656440734863
top: 13.409090995788574
width: 362.0674743652344
x: 9.409090042114258
y: 13.409090995788574
cornerPoints: Array(4)
0: {x: 9.52997875213623, y: 13.529980659484863}
1: {x: 370.59088134765625, y: 13.409090995788574}
2: {x: 371.4765625, y: 375.4765319824219}
3: {x: 9.409090042114258, y: 374.5908508300781}
length: 4
rawValue: "https://qiutc.me/"
length: 1
Каждый элемент полученного массива представляет собой объект DetectedBarcode распознанного QR-кода, содержащий три свойства:
- DetectedBarcode: информация о местоположении QR-кода;
- угловые точки: последовательность вершин распознанного штрих-кода;
- rawValue: реальное значение, представленное QR-кодом, представляет собой строковое значение;
Полная демонстрация:Ищем в том же городе.GitHub.IO/Superstition-demo/…
3. Распознавание текста
TextDetector — это низкоуровневый компонент платформы ускорения, который распознает текст в изображениях, и мы создаем его экземпляр напрямую:
const textDetector = new TextDetector();
Как и FaceDetector, используйте функцию обнаружения для обнаружения изображений, этот метод также принимаетImage
илиBlob
объект, возвращаяPromise
Объект:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Shape Detection API Demo</title>
<style>
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<img id="text-image" crossorigin="anonymous" src="//opsqe9du9.bkt.clouddn.com/img-3.png" alt="TEXT">
<script type="text/javascript">
window.onload = main;
function main () {
const textDetector = new TextDetector();
const image = document.getElementById('text-image');
textDetector.detect(image)
.then(detectedTexts => {
console.log(detectedTexts);
})
.catch((e) => {
console.error("Text Detection failed, boo.", e);
})
}
</script>
</body>
</html>
Как и в приведенном выше примере, распечатайте обнаруженныйdetectedTexts
:
(12) [DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText, DetectedText]
0: DetectedText
boundingBox: DOMRect {x: 190.78125, y: 42.1875, width: 1527.984375, height: 31.21875, top: 42.1875, …}
cornerPoints: (4) [{…}, {…}, {…}, {…}]
rawValue: ""
1: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
2: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
3: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
4: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
5: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
6: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
7: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
8: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
9: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
10: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
11: DetectedText {rawValue: "", boundingBox: DOMRect, cornerPoints: Array(4)}
length: 12
Каждый элемент полученного массива представляет собой объект распознанного текста DetectedText, содержащий три свойства:
- DetectedBarcode: информация о местоположении текста;
- угловые точки: информация о положении вершины;
- rawValue: Реальное значение текста. Из демки мы обнаружили, что оно пустое. Должно быть, эта функция реализована не полностью;
Полная демонстрация:Ищем в том же городе.GitHub.IO/Superstition-demo/…
Суммировать
С текущей точки зрения, Shape Detection API все еще находится в экспериментальной стадии, и его функции несовершенны, но считается, что в ближайшие несколько лет эта функция будет постепенно улучшаться и применяться в производственной среде.
С API-интерфейсом определения формы сложность приложения во многих сценариях может быть значительно снижена, а веб-приложение можно сделать более независимым.
- Используя распознавание лиц, мы можем более точно идентифицировать лица и давать более точные рекомендации при обработке изображений пользователями;
- Применяя распознавание QR-кода/штрих-кода с вызовом камеры, вы можете напрямую получать информацию о сканировании на уровне интерфейса и выполнять такие операции, как оплата, прыжок и добавление друзей;
- Применяя распознавание текста, мы можем напрямую реализовать функцию OCR на стороне пользователя;
С текущей точки зрения, все больше и больше низкоуровневых API могут использоваться непосредственно в среде браузера, а интерфейсные приложения могут напрямую использовать больше системных ресурсов и вызывать больше аппаратных интерфейсов. Это также тенденция в будущем.Когда браузеры предоставят Интернету больше возможностей, Интернет также сможет предоставить пользователям лучший опыт.