注意:咱們目前正在使用此 API 的規範做爲功能項目的一部分,隨着這個新的 API 從設計轉向實現,咱們將保持這篇文章的不斷更新。html
藉助 API navigator.mediaDevices.getUserMedia
和新版安卓的 chrome photo picker,從移動設備上的相機獲取圖像或者實時上傳視頻數據或本地圖像變得至關容易。在此以前,這些動態的圖像數據以及頁面上的靜態圖像一直都是個咱們沒法操做的黑盒,即便圖像實際上可能包含許多有趣的特徵,如人臉、條形碼和文本。前端
過去,若是開發人員想要在客戶端提取這些特徵,例如構建一個二維碼識別器,他們必須藉助外部的 JavaScript 庫。從性能的角度來看代價是昂貴的,而且會增長總體頁面的資源體積。另外一方面,諸如 Android、iOS 和 macOS 這些操做系統,以及他們的相機模塊中的硬件芯片,一般已經具備高性能和高度優化的特徵檢測器,例如 Android 的 FaceDetector
或者 iOS 自帶的特徵檢測器 CIDetector
。android
而 Shape Detection API 作的即是調用這些原生實現,並將其轉化爲一組 JavaScript 接口。目前,這個 API 支持的功能是經過 FaceDetector
接口進行人臉檢測,經過 BarcodeDetector
接口進行條形碼檢測以及經過 TextDetector
接口進行文本檢測(光學字符識別,OCR)。ios
小提示:儘管文本檢測是一個有趣的領域,但在目前要標準化的計算平臺或字符集中,文本檢測還不夠穩定,這也使文本檢測已經有一套單獨的信息規範的緣由。git
閱讀更多相關解釋github
如上所述,Shape Detection API 目前支持檢測人臉、條形碼和文本。如下列表包含了全部三個功能的用例示例:web
人臉檢測chrome
條形碼檢測canvas
文字檢測後端
img[alt]
屬性值來改善用戶生成的圖像內容的體驗。步驟 | 狀態 |
---|---|
一、建立解釋器 | 完成 |
二、建立規範的初始草案 | 進行中 |
三、收集反饋並迭代 | 進行中 |
四、投入實驗 | 進行中 |
5. 發佈 | 未開始 |
三個檢測器向外暴露的接口 FaceDetector
、BarcodeDetector
和 TextDetector
都很是類似,它們都提供了一個異步方法 detect
,它接受一個 ImageBitmapSource
輸入(或者是一個 CanvasImageSource
、[Blob
] 對象(w3c.github.io/FileAPI/#df…) 或者 ImageData
)。
在使用 FaceDetector
和 BarcodeDetector
的狀況下,可選參數能夠被傳遞到所述檢測器的構造函數中,其容許向底層原生檢測器發起調用指示。
小提示:若是你的
ImageBitmapSource
來自一個 獨立的腳本源 而且與 document 的源不一樣,那麼detect
將會調用失敗並拋出一個名爲 SecurityError 的DOMException
。若是你的圖片對跨域設置了 CORS,那麼你可使用crossorigin
屬性來請求 CORS 訪問。
FaceDetector
const faceDetector = new FaceDetector({
// (Optional) Hint to try and limit the amount of detected faces
// on the scene to this maximum number.
maxDetectedFaces: 5,
// (Optional) Hint to try and prioritize speed over accuracy
// by, e.g., operating on a reduced scale or looking for large features.
fastMode: false
});
try {
const faces = await faceDetector.detect(image);
faces.forEach(face => console.log(face));
} catch (e) {
console.error('Face detection failed:', e);
}
複製代碼
BarcodeDetector
const barcodeDetector = new BarcodeDetector({
// (Optional) A series of barcode formats to search for.
// Not all formats may be supported on all platforms
formats: [
'aztec',
'code_128',
'code_39',
'code_93',
'codabar',
'data_matrix',
'ean_13',
'ean_8',
'itf',
'pdf417',
'qr_code',
'upc_a',
'upc_e'
]
});
try {
const barcodes = await barcodeDetector.detect(image);
barcodes.forEach(barcode => console.log(barcode));
} catch (e) {
console.error('Barcode detection failed:', e);
}
複製代碼
TextDetector
const textDetector = new TextDetector();
try {
const texts = await textDetector.detect(image);
texts.forEach(text => console.log(text));
} catch (e) {
console.error('Text detection failed:', e);
}
複製代碼
在使用 Shape Detection API 接口以前檢查構造函數是否存在是必須的,由於雖然 Linux 和 Chrome OS 上的 Chrome 目前已經開放了檢測器的接口,但它們卻無法正常使用(bug)。做爲臨時措施,咱們建議在使用這些 API 以前應當這麼作:
const supported = await (async () => 'FaceDetector' in window &&
await new FaceDetector().detect(document.createElement('canvas'))
.then(_ => true)
.catch(e => e.name === 'NotSupportedError' ? false : true))();
複製代碼
全部檢測器都是異步工做的,也就是說,它們不會阻塞主線程 🎉 ,所以不要過度追求實時檢測,而是給檢測器一段時間來完成其工做。
若是你是 Web Workers 的忠實粉絲(難道還有人不是嗎?)最棒的是檢測器的接口也暴露在那裏。檢測結果也是可序列化的,所以能夠經過 postMessage
將其從 worker 線程傳回主線程。這裏有個 demo 展現了一些簡單實踐。
並不是全部平臺實現都支持全部功能,所以請務必仔細檢查支持狀況,並將 API 看做是漸進加強功能。例如,某些平臺自己可能支持人臉檢測,但不支持面部標誌檢測(眼睛、鼻子、嘴巴等等),或者能夠識別文本的存在和位置,但不識別實際的文本內容。
小提示:此 API 是一種優化,並不能保證每一個用戶均可以正常使用。指望開發人員將其與他們本身的圖像識別代碼相結合,當其可用時將其做爲原生的一種優化手段。
咱們須要您的幫助,以確保 Shape Detection API 可以知足您的需求,而且咱們不會錯過任何關鍵方案。
咱們須要你的幫助! —— Shape Detection API 的當前設計是否知足您的需求?若是不能,請在 Shape Detection API repo 提交 issue 並提供儘量詳細的信息。
咱們也很想知道您打算如何使用 Shape Detection API:
在 Shape Detection API WICG Discourse 上分享您的討論與見解。
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。