可以让你玩儿光剑的程序,vc实现方法和代码
http://blog.csdn.net/onezeros/article/details/6124073
前幾天寫了一個可以玩兒光劍的程序,個人覺得很酷
?
這個程序你完全可以在自己電腦上玩玩,很有星球大戰(zhàn)中Jedi的感覺
?
在程序中,本沒必要使用opencv,但嘗試把opencv和mfc dialog結(jié)合一下,于是最終實現(xiàn)方式如下:
opencv采集圖像,mfc雙緩沖顯示,gdi+顯示光劍圖片
opencv和mfc 的結(jié)合費了不小勁兒才想到方法。
而且發(fā)現(xiàn),在xp中(至少在我的電腦上),顯存模式是BGRA順序,不知道各位高手是否認(rèn)同。剛開始我認(rèn)為是RGB但顯示結(jié)果很奇怪。
最終把IplImage數(shù)據(jù)(BGR)重新按BGRA(A=0)顯示時得到正確顯示
?
至于圖像處理,很簡單,簡單的閾值化后找打目標(biāo),然后顯示圖片即可
?
為了使光劍更漂亮,學(xué)了點Photoshop,效果差強人意,如果你能ps出更好的圖片,可以把程序中的圖片替換的,文件名不變就可以
在別人的視頻中找了點光劍揮動的聲音
?
視頻演示:http://v.youku.com/v_show/id_XMjM1NDM0OTEy.html,
錄像設(shè)備太差,聲音效果不好,于是關(guān)了聲音。你在運行程序時會聽到聲音,很有感覺的
?
代碼下載:http://download.csdn.net/source/2969385
?
結(jié)合下圖介紹一下玩法:
1:找一個顏色鮮艷點兒的棍子(在演示中我用的兩個道具:一根棍子繞上了一個紅色的塑料袋,垃圾鏟的柄),要求并不高,只要有個主要色調(diào)就成,比如藍色,紅色。圖中1處即為繞了一個紅色塑料袋的棍子。
2:調(diào)節(jié)閾值。如果你不熟悉rgb,這一步似乎不太容易。點擊你用的棍子(圖中1處),在圖中2處有rgb顯示,多點幾下,看看大致范圍。然后調(diào)節(jié)圖中4處rgb閾值。如果選中對應(yīng)的多選框,表示你的棍子的這個分量小于閾值,否則表示大于。圖示中,我用的是紅色主調(diào),于是R不選中,G、B選中。調(diào)整要達到的效果是,使圖中3處清晰顯示你棍子的位置,不是棍子的區(qū)域盡量減少
3:在圖中5處,選擇你喜歡的顏色。我做了六種簡單的效果,你可以自己做更漂亮的替換之
4:圖中6處可以關(guān)掉光劍顯示
5:圖中7處是為方便調(diào)試時做的,可以顯示程序?qū)ふ夜髯拥木€
不一定非得是棍子,我用的方法是擬合最大目標(biāo)區(qū)域的直線
我的攝像頭是640*480的,如果你的是320*240或別的,顯示窗口可能不一樣,但都可以玩
?
?
?
下面是幾個截圖:
?
?
垃圾鏟
?
?
?
用手玩
?
光劍的幾種效果:
?
歡迎朋友們給點意見!
?==============================================================================
update:
?
非常感謝wo_men123456在評論中的意見:
wo_men123456:霍夫直線檢測后,在用dx畫
?
今天我又用直線檢測做了一下,剛做的時候用canny邊緣檢測,效果出來時才意識到棍子有兩條邊,而本程序需要的不僅是直線,而且應(yīng)該是中線。于是后又采用細(xì)化處理+hough檢測,效果不錯。
但想來直線檢測和我原來采用的直線擬合就在本程序中的應(yīng)用而言還是有區(qū)別的:
?因為光照的不斷變化,閾值化后的圖像在相鄰幀之間也會不同,不同之處主要在目標(biāo)邊緣部分.
于是細(xì)化得出的線主要在兩端出變化較大(圖像端點處的結(jié)構(gòu)對細(xì)化結(jié)果影響是比較大的),這樣,這條線就不能很好地表示棍子。而hough直線檢測,因為只是檢測這一條線,給出的直線斜率變化較快,在光劍程序中就顯得不太適合。
而直線擬合的方法因為使用了棍子的所有點,在試驗中直線表現(xiàn)更為穩(wěn)定,即斜率變化平滑。
我原來方法的不足之處:要求目標(biāo)區(qū)域是連通的。
目標(biāo)出現(xiàn)小距離中斷時,檢測到的直線段會突然變短,而hough直線檢測可以較好地避免這個問題。解決方法是在檢測連通域時擴大像素連接的距離。不過隨之而來的是效率在一定程度上的下降。
?
?hough直線檢測法代碼下載:http://download.csdn.net/source/2977153
?
單幀效果比較:
1、細(xì)化+hough直線檢測
2、canny邊緣+hough直線
?
3、我原本的方法:直線擬合
總結(jié)
以上是生活随笔為你收集整理的可以让你玩儿光剑的程序,vc实现方法和代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: otsu自适应阈值分割的算法描述和ope
- 下一篇: 石头剪刀布 手势识别