過年了,來點有趣的東西javascript
最近一直在嘗試經過web如何DIY視頻,怎麼捕捉視頻的行爲,給視頻加點好玩的東西,好比給視頻加一個鬍子?html
如下記錄一下最近的玩具前端
點擊這裏看本身的效果(須要容許攝像頭呀!!)java
效果大概以下:
就是給視頻的臉上加個鬍子(我手機上有防藍光的膜,各位大爺將就着看吧)node
首先我作的視頻動態繪製鬍子的東西,那確定要先支持視頻吧git
這裏代碼就很是簡單,新建一個html
,寫上一個video
標籤github
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia if (navigator.getUserMedia) { navigator.getUserMedia( { video: { width: 500, height: 500 } }, function (stream) { var video = document.querySelector('video') video.srcObject = stream video.onloadedmetadata = function (e) { video.play() } }, function (err) { console.log('The following error occurred: ' + err.name) } ) } else { console.log('getUserMedia not supported') }
寫到這裏視頻就能夠播放了web
而後咱們把這個視頻放進canvas
裏,canvas
其實就是定時採集video
的內容,而後drawImage
到canvas
就行了segmentfault
setInterval(() => { v.drawImage(video, 0, 0, 500, 375) vData = v.getImageData(0, 0, 500, 375) }, 20)
這裏開始canvas裏面的內容也就開始動起來了
下面就是必要重要的內容了
我要作的是面部識別,全部怎麼識別呢
而後就是找到了一個這個 trackingjs
看了一下效果,很是好,雖然有點慢,可是知足咱們的功能
face(image)-demo
face(camera)-demo
好,那麼先在本地跑個demo試試
......而後5min過去了
且慢,好像這個識別不能識別camera
的內容(camera
只支持到face
,不支持mouth
、eye
、nose
級別)
mdzz
ps: 若是隻是簡單加個帽子之類的東西的話,用這個庫也就夠了
下面幾天我基本上就卡在這個環節幾天都沒有什麼好的思路
直到某天,我隨便刷的時候看到了這個實現face-detection-node-opencv
咦,她也實現了面部識別,好像這我的再trackingjs
的contributor
裏面見過,而後她用到了opencv
,記得在今年d2
的大會上主會場某幾個嘉賓也分享了ar
主題的東西,也是用服務器來實現的(就是canvas
的getImageData
後把數據傳給後端,後端處理完再把結果返回),當時我覺得效率會不好(在圖片傳輸方面),其實看下來好像效果還能夠
好,接下里就配上後端來寫,彷佛功能會多不少。那麼接下來就像武器大師說的:開打開打
那麼就看opencv
的node
有什麼好的實現了
then,node-opencv,這個能夠識別到face級別,好像不太夠
再找
yooyoo,眼睛鼻子都識別出來了,很屌嘛,就你了
那就直接搭node
服務跑起來唄
而後簡單花了10分鐘搭了個koa2
的服務
總體思路就是:
video
video
=> canvas
=> base64
=> ArrayBuffer
(這個庫只能識別圖片對象或者ArrayBuffer)websocket
先後端通信face、mouth
在圖片上的位置數據done
下面是 後端處理圖片的時間,平均大概5ms,當作玩具的話,勉強夠 start: 4.568ms start: 3.881ms start: 3.564ms start: 3.690ms start: 5.971ms start: 4.069ms start: 3.364ms start: 5.054ms start: 22.219ms start: 5.586ms start: 5.000ms
本地測試一切正常,可是部署到服務器上的時候,仍是有一些問題
opencv
的時候有深坑video
,只能在https
下用https
下的websocket
得升級到 wss
這裏既然是前端文章,那麼我就不張開來說部署的問題了,
差很少就是這樣思路
多是今年最後一篇,寫的可能比較隨意,不知道上下文連不連貫(看官們,抱歉)
而後最後的結果就如文章最開始所見:
點擊這裏看本身的效果(須要容許攝像頭呀!!)
詳細代碼的話:
先後端都在這裏了: face-decorator