今天發(fā)現(xiàn)一篇文章寫的很有趣,叫你如何使用HTML5進行人臉識別。在網(wǎng)頁內(nèi)進行人臉識別,很好很強大!
“現(xiàn)代Web”不斷發(fā)展出不少有趣的API,但你并不會在大多數(shù)項目中使用到所有的內(nèi)容。例如我一直特別關(guān)注Canvas特性。它對游戲和繪圖意義重大 – 但是僅此而已。它并不是一個不好的特性,我只是不會經(jīng)常用到它。每當(dāng)看到一些開發(fā)中酷炫的新功能,我的大腦里都會思考它們可以產(chǎn)生哪些實際用途。顯然對你有價值的內(nèi)容可能對我來說并不一定,但搞清楚我如何實際使用一個功能是我學(xué)習(xí)它的一部分。
其中的一個特性是getUserMedia( W3C規(guī)范 )。它是一個JavaScript API,可以讓你訪問(需要權(quán)限)用戶的網(wǎng)絡(luò)攝像頭和麥克風(fēng)。 目前Opera和Chrome(我相信現(xiàn)在的版本18可以支持,但是你可能需要使用Canary。你還需要啟用它。這兒有一個說明。)一旦你啟用了getUserMedia,它使用起來相當(dāng)簡單。這里有一個快速的訪問請求:
- //a video tag
- var video = document.getElementById(‘monitor’);
- //request it
- navigator.webkitGetUserMedia(‘video’, gotStream, noStream);
- function gotStream(stream) {
- video.src = webkitURL.createObjectURL(stream);
- video.onerror = function () {
- stream.stop();
- streamError();
- };
- }
- function noStream() {
- document.getElementById(‘errorMessage’).textContent = ‘No camera available.’;
- }
- function streamError() {
- document.getElementById(‘errorMessage’).textContent = ‘Camera error.’;
- }
getUserMedia的第一個參數(shù)是類型。根據(jù)規(guī)范,這應(yīng)該是一個對象,你可以啟用音頻、視頻,或兩者兼而有之,像這樣:{audio:true, video:true}。然而在我的測試中,傳遞一個字符串“video”也可以正常工作。你將看到的演示基于另一個演示,所以代碼來自于一個較早的Chrome下的版本。第二個和第三個參數(shù)是操作成功和失敗的回調(diào)函數(shù)。
你可以看到操作成功的事件處理函數(shù)將視頻流分配給HTML5 Video標(biāo)簽。最酷的是,一旦運行起來,你就可以使用Canvas API來拍照。對于這個演示,可以看看Greg Miernicki的Demo:http://miernicki.com/cam.html
如果這個Demo無法工作,可以按照下面的說明來開啟getUserMedia支持后再次進行嘗試。(雖然我打算分享一些屏幕截圖,所以如果你只是想繼續(xù)閱讀,那也沒關(guān)系。)
基于Greg的Demo,我突然想到可以用網(wǎng)絡(luò)攝像頭的照片做一些很酷的東西。我記得Face.com有一個非常酷的API來解析臉部的圖片。(我11月曾經(jīng)在博客里寫了一個ColdFusion的例子。)然后我在想,是否我們能把Greg的Demo與Face.com的API結(jié)合起來做一些基本面部識別的Demo。
這有這幾個重大問題。 第一 – Face.com有一個很好的REST API,我們將如何從JavaScript應(yīng)用程序里面來調(diào)用它?其次 – Face.com需要你可以上傳圖片,或給它一個網(wǎng)址。 我知道可以把一個Canvas圖片發(fā)送給服務(wù)器,并通過我的后臺上傳到Face.com,但有沒有辦法繞過服務(wù)器來把圖片發(fā)送給這個API?
第一個實際上并不是問題。Face.com實現(xiàn)了CORS(跨域資源共享)。CORS系統(tǒng)基本上可以讓服務(wù)器暴露給其它域上文件的Ajax調(diào)用。這是一個偉大的功能,我希望更多的服務(wù)能夠使用它。
更復(fù)雜的問題則是如何把畫布上的數(shù)據(jù)發(fā)送到Face.com(注:還可以參考我的這篇文章《如何使用HTML5實現(xiàn)拍照上傳應(yīng)用》)。我如何模擬文件上傳?這里有另一個很酷的新技巧 – Formdata。ColdFusion的研究員Sagar Ganatra關(guān)于這個話題有一篇很棒的博客。下面展示了我如何使用它:
- function snapshot() {
- $(“#result“).html(“<p><i>Working hard for the money…</i></p>“);
- canvas.width = video.videoWidth;
- canvas.height = video.videoHeight;
- canvas.getContext(’2d’).drawImage(video, 0, 0);
- var data = canvas.toDataURL(‘image/jpeg’, 1.0);
- newblob = dataURItoBlob(data);
- var formdata = new FormData();
- formdata.append(“api_key“, faceKey);
- formdata.append(“api_secret“, faceSecret);
- formdata.append(“filename“,”temp.jpg“);
- formdata.append(“file“,newblob);
- $.ajax({
- url: ‘http://api.face.com/faces/detect.json?attributes=age_est,gender,mood,smiling,glasses’,
- data: formdata,
- cache: false,
- contentType: false,
- processData: false,
- dataType:”json“,
- type: ‘POST’,
- success: function (data) {
- handleResult(data.photos[0]);
- }
- });
- }
讓我們一行行來看這段代碼。首先 – 我需要從畫布對象獲取二進制數(shù)據(jù)。有幾種方法可以實現(xiàn),但是我尤其想要一個二進制的Blob。請注意dataURIToBlob方法。這是幾周前我從StockOverflow上發(fā)現(xiàn)的。
我創(chuàng)建了一個新的formdata對象,然后簡單地設(shè)置了自己所需的值。你可以看到我發(fā)起了幾個API請求,但關(guān)鍵在于文件名和文件對象本身。
接下來你可以看到簡單的jQuery Ajax調(diào)用。Face.com有多種選擇,但我基本只要求它返回預(yù)測年齡、性別、情緒,是否面帶微笑以及戴著眼鏡。就是這些。我得到了一個很棒的JSON包,并且對它進行了格式化。
現(xiàn)在顯然API并不完美。我獲得了使用API一些不同程度的結(jié)果。有時相當(dāng)準(zhǔn)確,有時相反。但是總體來說,這相當(dāng)酷。這里有一些實際測試的圖片,看起來有點“可怕”。
識別結(jié)果:neutral(無表情)
識別結(jié)果:happy(開心)
識別結(jié)果:surprised(驚訝)
識別結(jié)果:sad(悲傷)
好了,準(zhǔn)備自己親自來試試? 只需點擊下面的演示按鈕。如果需要源代碼,可以直接在頁面上查看! 這是100%的純客戶端代碼。
原文地址:http://www.html5cn.org/article-2554-1.html
【編輯推薦】
聯(lián)系客服