一、主要內容概述
該美顏相機主要實現的是拍攝照片並對其進行磨皮和美白兩種功能的實現。
二、相關技術簡介
1.OpenCV.js
OpenCV是一個采用C語言進行優化,用於圖像處理、分析、機器視覺方面的開源函數庫。該庫包含了橫跨工業產品檢測、醫學圖像處理、安防、用戶界面、攝像頭標定、三維成像、機器視覺等領域的超過500個接口函數。OpenCV.js是JavaScript開發者與OpenCV函數庫之間的橋梁,JavaScript開發者開發的OpenCV應用接口,是借助編譯器將庫底層 C++ 代碼編譯為,可以在瀏覽器運行的 asm.js 。OpenCV.js 的出現使得 JavaScript 開發者可以高效便捷的使用 OpenCV 提供的圖形處理算法,開發者僅憑借瀏覽器就能快速開發例如圖片美化、圖像識別、人臉檢測、人臉識別、特定目標追蹤等功能的應用。
2.磨皮
磨皮是最基礎的美顏效果。主要分為祛斑,祛痘,淡化黑眼圈等步驟。磨算是檢測一個美顏相機優劣的最重要的部分了,能實現好的磨皮效果的美顏相機一定是更受歡迎的;而我們常用的濾波有均值濾波,高斯濾波以及雙邊濾波三種,到底選用那種濾波呢?
首先,均值濾波會因為是用周圍像素的平均值代替原像素值,肯定會導致圖像過於模糊,所以排除掉。其次,高斯濾波與均值濾波原理類似,只是高斯濾波器的模板系數會隨着距離模板中心的增大而減小,雖然可以減弱圖像的模糊程度,但是圖像邊緣信息會丟失。
那么,只剩一個濾波了,也就是雙邊濾波器。因為它同時綜合了高通濾波器和a-截尾均值過濾器的疊加效果,即可以保證圖像不是非常模糊,也可以保留圖像邊緣信息。
而人臉磨皮原理的步驟分為如下3個步驟:
- 圖像濾波
- 圖像融合
- 圖像銳化
本算法采用雙邊濾波算法,雙邊濾波則考慮了空間域和像素域,能夠滿足保留邊緣的需要;
雙邊濾波組合了空間上鄰近程度的權重和像素顏色值相似程度的權重。公式如下:

其中,f是原始圖像,h是濾波后圖像,x是卷積核中心點,ξ是x的相鄰點。卷積核包括了兩部分:
·空間權重c(ξ,x)衡量幾何空間上的鄰近程度,顏色權重s(f(ξ),f(x))衡量色彩空間上的相似程度。
·權重c和權重s都遵循高斯分布:離中心點的幾何距離越遠,權重c越小;和中心點的顏色差異越大,權重s越小。
利用調用OpenCV函數庫與雙邊濾波實現對圖片進行磨皮的處理:

3.美白
美白算法采用的是補色、濾色、以及高斯模糊算法來實現的。圖像模糊算法,實現原理也並不是很難懂,要設計一個程序來模糊處理一個圖像的話,對於正在處理的每一個像素,取周圍若干個像素的RGB值並且平均,然后這個平均值就是模糊處理過的像素,如果對圖片中的所有像素都這么處理的話,處理完成的圖片就會變得模糊。但是這樣做的效果並不是,如果圖片顏色變化頻繁而且單位面積里面顏色反差很大,並且模糊半徑很大的話,那么結果就是:模糊范圍的最外層的像素和中心像素周圍的像素的權重是一樣的,這樣處理的圖片可能過渡並不是很平滑。所以,需要有一個算法,來為這些在模糊范圍中的像素來分別計算權重,這樣的話越在模糊半徑外圍的像素權重越低,造成的影響就越小,越在內側的像素得到的權重最高,因為內側像素更加重要,他們的顏色應該與我們要處理的中心像素更接近,更密切。這個時候就需要用到高斯模糊算法了。
正態分布一種概率分布,也稱“常態分布”。正態分布具有兩個參數μ和σ^2的連續型隨機變量的分布,第一參數μ是服從正態分布的隨機變量的均值,第二個參數σ^2是此隨機變量的方差,所以正態分布記作N(μ,σ^2)。服從正態分布的隨機變量的概率規律為取與μ鄰近的值的概率大,而取離μ越遠的值的概率越小;σ越小,分布越集中在μ附近,σ越大,分布越分散。
高斯過濾在圖像處理是一種低通濾波,會除去圖像的細節而保持整體不變化;參考Photoshop中對中的算法來實現對圖片整體進行處理。




3.1RGB
RGB是從顏色發光的原理來設計定的,通俗點說它的顏色混合方式就好像有紅、綠、藍三盞燈,當它們的光相互疊合的時候,色彩相混,而亮度卻等於兩者亮度之總和,越混合亮度越高,即加法混合。
紅、綠、藍三個顏色通道每種色各分為256階亮度,在0時“燈”最弱——是關掉的,而在255時“燈”最亮。當三色灰度數值相同時,產生不同灰度值的灰色調,即三色灰度都為0時,是最暗的黑色調;三色灰度都為255時,是最亮的白色調。
在電腦中,RGB的所謂“多少”就是指亮度,並使用整數來表示。通常情況下,RGB各有256級亮度,用數字表示為從0、1、2...直到255。注意雖然數字最高是255,但0也是數值之一,因此共256級。
3.2.HSV
HSV是一種比較直觀的顏色模型,所以在許多圖像編輯工具中應用比較廣泛,這個模型中顏色的參數分別是:色調(H, Hue),飽和度(S,Saturation),明度(V, Value)。
色調H。
用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°。它們的補色是:黃色為60°,青色為180°,品紅為300°;
飽和度S。
飽和度S表示顏色接近光譜色的程度。一種顏色,可以看成是某種光譜色與白色混合的結果。其中光譜色所占的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高。飽和度高,顏色則深而艷。光譜色的白光成分為0,飽和度達到最高。通常取值范圍為0%~100%,值越大,顏色越飽和。
明度V。
明度表示顏色明亮的程度,對於光源色,明度值與發光體的光亮度有關;對於物體色,此值和物體的透射比或反射比有關。通常取值范圍為0%(黑)到100%(白)。

實現RGB與HSV之間的相互轉換來調整圖片的飽和度,處理后的圖片顏色更鮮艷。代碼如下:
4.調用攝像頭
用到瀏覽器的攝像頭組件,然后再將圖片賦給canvas。

getUserMedia API使用媒體輸入設備生成MediaStream ,此MediaStream包含請求的媒體類型,無論是音頻還是視頻。 使用從API返回的流,可以在瀏覽器上顯示視頻供稿,這對於瀏覽器上的實時通信很有用。 與MediaStreamRecorder API一起使用時,我們可以記錄和存儲在瀏覽器中捕獲的媒體數據。 該API僅適用於安全來源,就像其他新引入的API一樣,它仍然適用於localhost和文件url。確認瀏覽器對getUserMedia的支持后,下一步是請求允許使用用戶代理上的媒體輸入設備。
我們應該保留對當前流的引用,這樣當我們切換到另一個流時就能停止當前流。函數 stopMediaTracks 接收一個媒體流,循環遍歷流中的每一個媒體軌道,調用 stop 方法停止媒體軌。要在點擊同一個按鈕時改變攝像頭,所以我們需要更新一下按鈕的事件監聽器了。如果當前有媒體流,我們應該先停止掉它。然后我們要檢查 <select> 元素看是否選擇了特定的設備,然后基於此構造 media constraints 對象。
由於拍攝照片時是鏡像的,所以需要對照片進行翻轉。

三、結果演示



四、參考文獻
https://www.cnblogs.com/kex1n/p/3663533.html
http://blog.csdn.net/qinghuaci666/article/details/81870277
https://blog.csdn.net/weixin_43280713/article/details/84133915
https://blog.csdn.net/culiu9261/article/details/107542407
五、成果展示鏈接
鏈接:https://pan.baidu.com/s/1P6u1UtgCX1cJ4ldnRw_1FA
提取碼:s92j
小組成員:陳昱江 吳永琪 焦航傑 韓寧 王楊
