Advanced(高級(jí))篇
2.Green Screen Example
這個(gè)demo有點(diǎn)難啃啥供,可能因?yàn)閳D形學(xué)基礎(chǔ)太弱凳干,但基礎(chǔ)實(shí)現(xiàn)目標(biāo)還是能看懂炮叶,就是將人物和背景分離乡括,由于我的背景為白色,所以直接用demo計(jì)算出的效果與原目的不大一樣漱挎,這里我們把第134行定義背景色mat數(shù)據(jù)的代碼稍微改一下化戳,在末尾加上“,?new?Scalar(255,?255,?255,?255)”戴已。(參照137行的加法本橙,這里的顏色可以根據(jù)個(gè)人攝像頭中的背景色調(diào)整晚岭,否則他就默認(rèn)背景為黑色了)
這樣運(yùn)行出來的效果就好多了。
接下來細(xì)看代碼,依舊是簡(jiǎn)單看一下初始化函數(shù)坦报,然后聚焦到update,先不管按鍵觸發(fā)內(nèi)容狂鞋,然后看到了函數(shù)findFgMaskMat片择,定位進(jìn)去,首先是absdiff函數(shù)骚揍,計(jì)算當(dāng)前幀與背景之差的絕對(duì)值字管,參考:https://blog.csdn.net/zdyueguanyun/article/details/50853477
這里absdiff正著反著調(diào)用了兩次再求和,嘗試了一下只調(diào)用第一次信不,大體上效果差不多嘲叔,但沒有調(diào)用兩次求和的效果好(雖然demo最終的效果也并不理想,但是不影響我們繼續(xù)看代碼學(xué)習(xí))抽活。
然后是threshold函數(shù)硫戈,圖像的二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,這樣將使整個(gè)圖像呈現(xiàn)出明顯的黑白效果下硕。在數(shù)字圖像處理中丁逝,二值圖像占有非常重要的地位,圖像的二值化使圖像中數(shù)據(jù)量大為減少梭姓,從而能凸顯出目標(biāo)的輪廓霜幼。參考:https://blog.csdn.net/u012566751/article/details/77046445
然后是轉(zhuǎn)灰度圖,再進(jìn)行了兩次二值化誉尖,區(qū)別是參數(shù)不一樣罪既,有關(guān)二值化參數(shù),詳細(xì)閱讀:https://blog.csdn.net/lj501886285/article/details/52425157
具體這里為什么要三次二值化铡恕,還有三次參數(shù)不同是什么作用琢感,就不大能理解了,后續(xù)再回頭來看吧没咙。(個(gè)人嘗試了一下在僅absdiff一次的情況下猩谊,把第二次二值化去掉效果貌似更好點(diǎn))
好,回到Update祭刚。
下一句是bitwise_not牌捷,是對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行“非”操作,即對(duì)圖像(灰度圖像或彩色圖像均可)每個(gè)像素值進(jìn)行二進(jìn)制“非”操作涡驮。這里很好理解了暗甥,經(jīng)過上面一系列操作,fgMaskMat捉捅,前景的mat已經(jīng)算出來了撤防,然后取非,就是背景的mat棒口,再將綠色greenMat寄月,用背景mat的數(shù)據(jù)遮罩到rgbaMat上辜膝,就完成了綠幕的效果。
最后一句就是賦值圖像漾肮。
這里還用到了一個(gè)判斷厂抖,按空格鍵了之后將rgbamat放到右上角顯示,但是實(shí)測(cè)按了空格鍵后會(huì)有別的bug克懊,-忱辅。-。這里就不細(xì)看了谭溉,回頭再研究解決墙懂。