從零開始制作H5人臉融合小游戲

去年的建軍節(jié)窿凤,一個展示軍裝照的H5人臉融合游戲火遍朋友圈,帶來很好的傳播效果跨蟹。最近歐冠決賽要來了,公司決定做一個尋找和你最像的歐冠球星的H5游戲橘沥,那么該怎么做呢窗轩?認真分析了一下,這個游戲其實用到的技術(shù)還是挺多的座咆,是一個比較綜合的項目痢艺。主要用到技術(shù)如下:

人臉識別
Python web和Java web
域名解析和nginx
微信JS
H5頁面

人臉識別

人臉識別的API各大平臺都有提供,百度介陶,阿里堤舒,優(yōu)圖(騰訊),F(xiàn)ace++. 各家的API大體相似哺呜,主要區(qū)別只是取的點的個數(shù)和返回結(jié)果的數(shù)據(jù)結(jié)構(gòu)舌缤,都可用。BAT的都有免費可用(如果對QPS沒有過高要求的話)某残,F(xiàn)ace++ 需要收費1元/次(墻裂懷疑失了智)国撵。綜合比較之后選擇使用優(yōu)圖。
http://open.youtu.qq.com/#/develop/api-face-analysis-detect
SDK下載
http://open.youtu.qq.com/#/develop/tool-sdk
后端采用python玻墅,所以下載python版本的SDK介牙。

youtu配置

從優(yōu)圖獲取的人臉識別之后的信息全部是面部點的信息,需要進行處理澳厢,具體的處理方法全部在
https://github.com/tonyiweb/face_merge_master (star环础,fork來一套?)
感興趣的star,fork一下

人臉融合大師剩拢,可以滿足你10分鐘做出人臉融合功能的理想工具线得,你值得擁有。

Python web和Java web

基于性能和表現(xiàn)的考慮裸扶,做了一個分離框都。圖片識別和融合的功能全部放在一個Python web項目中,作為一個api呵晨,然后在Java web項目中調(diào)用這個API魏保,將返回的結(jié)果或者錯誤信息返回到H5頁面。

Python web

python是一個能快速開發(fā)的語言摸屠,有很多易用的web框架可以使用谓罗,這里就選擇Tornado這個框架。


Tornado使用

服務(wù)器上通過nohup python -u run.py& 就可以啟動一個端口號為9010(代碼中可以指定季二,一般在7000以后)的服務(wù)檩咱。 nohup可以保證服務(wù)長期后臺運行揭措,并且可以通過tail -f nohup.out來查看日志。服務(wù)可以通過ps -ef|grep python查詢服務(wù)的pid刻蚯,再通過kill -9 pid來停止绊含。

Java web

采用SpringBoot搭建的微服務(wù),沒有任何界面炊汹。接受H5頁面?zhèn)鬟^來的圖片躬充,去調(diào)用人臉融合的API,根據(jù)結(jié)果返回調(diào)用結(jié)果或者錯誤信息讨便。


API返回結(jié)果

域名解析和nginx

域名解析的過程其實就是一個通過名字(相對好記一些)找IP地址(相對難以記憶)的過程充甚,而IP地址又對應(yīng)一臺服務(wù)器,也就是通過名字定位服務(wù)器霸褒。在控制臺的域名解析中新加一條記錄伴找,指向代碼部署的服務(wù)器。
因為一臺服務(wù)器上其實是部署多個服務(wù)废菱,也會被多個域名所指向技矮,所以其實還需要一個東西來指引服務(wù)所要對應(yīng)的域名,這個東西就是nginx昙啄。 一個服務(wù)一般是要對應(yīng)一個端口的穆役,nginx可以監(jiān)聽一個端口,然后將這個端口的服務(wù)定向到某個域名梳凛。


僅支持https

既支持http也支持https

注意:1耿币,https服務(wù)需要安全證書,可以在阿里云的安全中的CA證書服務(wù)中購買(有免費的Symantic的證書)
2韧拒,一般默認的是http的淹接,如果沒有必要可以不用帶安全證書的https服務(wù)
3,通過whereis nginx命令查找nginx的位置叛溢,通過vhost統(tǒng)一管理nginx配置文件
4塑悼,配置完nginx之后,需要重啟nginx服務(wù)楷掉,命令: ./nginx -s reload 如果沒有錯誤厢蒜,就說明已經(jīng)重啟了。

微信JS

因為網(wǎng)頁是放在微信環(huán)境下傳播的烹植,需要使用到微信的一些基礎(chǔ)功能斑鸦,如拍照,所以使用微信的JS SDK.
參考文檔:https://www.w3cschool.cn/weixinkaifawendang/h8ap1qe5.html

1草雕,配置微信巷屿。需要在后臺根據(jù)jsapi_ticket等信息生成簽名

(1)前臺

//這里的url為當前頁面的路徑,為了使得分享之后的鏈接也是可用
var url = window.location.href;
$.get(baseUrl+"/common/get_wx_config",{url:url},
  function(data){
  wx.config({
        debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來墩虹,若要查看傳入的參數(shù)嘱巾,可以在pc端打開憨琳,參數(shù)信息會通過log打出,僅在pc端時才會打印旬昭。
        appId: data.appId,   // 必填篙螟,公眾號的唯一標識
        timestamp: data.timestamp, // 必填,生成簽名的時間戳
        nonceStr: data.nonceStr, // 必填问拘,生成簽名的隨機串
        signature: data.signature,// 必填闲擦,簽名,
        jsApiList: ['checkJsApi','chooseImage','uploadImage','onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareQZone'] // 必填场梆,需要使用的JS接口列表
    });
    setShareInfo('','');
  })

(2)后臺,微信簽名過程


微信簽名過程

2,拍照或者從相冊中選擇照片

var serverId='0';
function getPic(){
    wx.checkJsApi({
        jsApiList: ['chooseImage'], // 需要檢測的JS接口列表,所有JS接口列表見附錄2,
        success: function(res) {
            if(res.checkResult.chooseImage){
                wx.chooseImage({
                    count: 1, // 默認9
                    sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖纯路,默認二者都有
                    sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機或油,默認二者都有
                    success: function (res) {
                        var localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標簽的src屬性顯示圖片
                        $("#selfImg").attr("src",localIds);
                        wx.uploadImage({
                            localId: localIds[0], // 需要上傳的圖片的本地ID驰唬,由chooseImage接口獲得
                            isShowProgressTips: 1, // 默認為1顶岸,顯示進度提示
                            success: function (res) {
                                serverId = res.serverId; // 返回圖片的服務(wù)器端ID
                                $("#nextBtn").css("display","block");
                            }
                        });
                    }
                });
            }else{
                showAlert("微信版本過低,無法使用相機和相冊功能","fail");
            }
        }
    });
}

3,上傳圖片并獲得人臉融合結(jié)果

(1)前臺

if(serverId!='0'){
        if(gender==1){
            showAlert("正在玩命給小主兒尋找最像你的球星...","loading");
        }else{
            showAlert("正在玩命給小主兒尋找最像你的球星太太...","loading");
        }
        //在服務(wù)器端下載圖片,并作人臉融合叫编,返回融合后的結(jié)果給img的src
        $.get(baseUrl+"/common/download_image",{serverId:serverId,gender:gender},
            function(data){
            if(data.status=='success'){
                hideAlert();
                $("#loadingPage").css("display","none");
                $("#firstPage").css("display","none");
                $("#secondPage").css("display","none");
                $("#thirdPage").css("display","block");
                var imageData = JSON.parse(data.data);
                $("#resultName").html(imageData.modelShortName);
                if(gender==1){
                    $("#discriptionText").html(imageData.description+'辖佣,要被你迷倒啦(^_-');
                    setShareInfo(imageData.imageUrl[2],'和我最像的歐冠球星是'+imageData.modelShortName+','+imageData.description)
                }else{
                    $("#discriptionText").html(imageData.modelName+'搓逾,'+imageData.description+'卷谈,要被你迷倒啦(^_-');
                    setShareInfo(imageData.imageUrl[2],'和我最像的歐冠女神是'+imageData.modelShortName+','+imageData.description)
                }

                $('#firstResultImg').animateCss('fadeIn', function() {
                    $("#firstResultImg").attr("src",imageData.imageUrl[0]);
                    $("#firstResultImg").addClass('animated flash');
                    $("#secondResultImg").animateCss('fadeIn',function(){
                        $("#secondResultImg").attr("src",imageData.imageUrl[1]);
                        $("#secondResultImg").addClass('animated flash');
                        $("#thirdResultImg").animateCss('fadeIn',function(){
                            $("#thirdResultImg").attr("src",imageData.imageUrl[2]);
                            $("#thirdResultImg").addClass('animated flash');
                            $("#fourthResultImg").animateCss('fadeIn',function(){
                                $("#fourthResultImg").attr("src",imageData.imageUrl[3]);
                                $("#fourthResultImg").addClass('animated flash');
                                $("#resultName").addClass('animated bounceIn');
                            });
                        });
                    });
                });
            }else{
                if(gender==1){
                    showAlert("好遺憾霞篡,沒有找到和你相像的球星呢...換張照片世蔗,再玩一次吧","fail");
                }else{
                    showAlert("好遺憾,沒有找到和你相像的球星太太呢...換張照片朗兵,再玩一次吧","fail");
                }
            }
        })
    }else{
        showAlert("好遺憾污淋,你還沒有上傳任何照片哦...","fail");
    }

(2)后臺,上傳照片并進行人臉融合


上傳照片并進行人臉融合

注意:需要在真機上才可以調(diào)用相機和相冊
注意:要使用的域名必須在公眾號設(shè)置——>功能設(shè)置中添加

H5頁面

頁面的大半是要依賴UI設(shè)計師,下面放些設(shè)計圖余掖,實現(xiàn)過程就省略掉(假裝不重要.)...

啟動頁

性別選擇頁

上傳照片頁

結(jié)果頁

后面是制作完成后得到頁面(請在微信中打開): https://worldcup.superwr.top/index.html
另外還有世界杯的改進版(加入了生成海報圖片和負載均衡):https://worldcup.pro365.cn/index.html

注意:H5頁面的難點其實是在于兼容寸爆,這里通過計算設(shè)備寬度,得到相對尺寸rem盐欺,然后給元素設(shè)置以rem為單位的位置尺寸等信息,做到全部兼容ios移動設(shè)備和大部分Android設(shè)備
注意:頁面中使用到了Animate.css這個CSS動畫框架赁豆,鏈接:http://blog.superwr.top/2018/%E5%8A%A8%E7%94%BB%E6%8F%92%E4%BB%B6animate-css%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/

歡迎訪問個人博客:http://blog.superwr.top/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市找田,隨后出現(xiàn)的幾起案子歌憨,更是在濱河造成了極大的恐慌,老刑警劉巖墩衙,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件务嫡,死亡現(xiàn)場離奇詭異甲抖,居然都是意外死亡,警方通過查閱死者的電腦和手機心铃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門准谚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人去扣,你說我怎么就攤上這事柱衔。” “怎么了愉棱?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵唆铐,是天一觀的道長。 經(jīng)常有香客問我奔滑,道長艾岂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任朋其,我火速辦了婚禮王浴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梅猿。我一直安慰自己氓辣,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布袱蚓。 她就那樣靜靜地躺著钞啸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喇潘。 梳的紋絲不亂的頭發(fā)上爽撒,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音响蓉,去河邊找鬼硕勿。 笑死,一個胖子當著我的面吹牛枫甲,可吹牛的內(nèi)容都是我干的源武。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼想幻,長吁一口氣:“原來是場噩夢啊……” “哼粱栖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脏毯,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤闹究,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后食店,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渣淤,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡赏寇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了价认。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅定。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖用踩,靈堂內(nèi)的尸體忽然破棺而出渠退,到底是詐尸還是另有隱情,我是刑警寧澤脐彩,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布碎乃,位于F島的核電站,受9級特大地震影響惠奸,放射性物質(zhì)發(fā)生泄漏荠锭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一晨川、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧删豺,春花似錦共虑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓬蝶,卻和暖如春尘分,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丸氛。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工培愁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缓窜。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓定续,卻偏偏與公主長得像,于是被迫代替她去往敵國和親禾锤。 傳聞我的和親對象是個殘疾皇子私股,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)恩掷,斷路器倡鲸,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧黄娘!Ngi...
    JokerW閱讀 32,646評論 24 1,002
  • 與貓有關(guān)的日子(一)之蛋黃 最早認識貓是我小時候在遼寧見的峭状。 那邊的天氣很冷克滴,印象中父母那時養(yǎng)了很多的...
    一只隨遇而安的貓閱讀 277評論 0 0
  • 項目要做一個搖一搖抽獎的需求,于是就提前做了個簡化的Demo宁炫,遇到的坑啊什么的偿曙,當然是記錄下來啦~~搖一搖抽獎的大...
    莦婼姑娘閱讀 2,039評論 0 4
  • 今天望忆,圣誕節(jié),我跟同學(xué)作為一名預(yù)備黨員去參加了預(yù)備黨員培訓(xùn)竿秆,經(jīng)過昨天一天思想的洗禮启摄,今天準備繼續(xù)聆聽時,老師讓...
    慵懶小書蟲閱讀 1,878評論 13 91