前几天写了一个可以玩儿光剑的程序,个人觉得很酷
这个程序你完全可以在自己电脑上玩玩,很有星球大战中Jedi的感觉
在程序中,本没必要使用opencv,但尝试把opencv和mfc dialog结合一下,于是最终实现方式如下:
opencv采集图像,mfc双缓冲显示,gdi+显示光剑图片
opencv和mfc 的结合费了不小劲儿才想到方法。
而且发现,在xp中(至少在我的电脑上),显存模式是BGRA顺序,不知道各位高手是否认同。刚开始我认为是RGB但显示结果很奇怪。
最终把IplImage数据(BGR)重新按BGRA(A=0)显示时得到正确显示
至于图像处理,很简单,简单的阈值化后找打目标,然后显示图片即可
为了使光剑更漂亮,学了点Photoshop,效果差强人意,如果你能ps出更好的图片,可以把程序中的图片替换的,文件名不变就可以
在别人的视频中找了点光剑挥动的声音
视频演示:http://v.youku.com/v_show/id_XMjM1NDM0OTEy.html,
录像设备太差,声音效果不好,于是关了声音。你在运行程序时会听到声音,很有感觉的
代码下载:http://download.csdn.net/source/2969385
结合下图介绍一下玩法:
1:找一个颜色鲜艳点儿的棍子(在演示中我用的两个道具:一根棍子绕上了一个红色的塑料袋,垃圾铲的柄),要求并不高,只要有个主要色调就成,比如蓝色,红色。图中1处即为绕了一个红色塑料袋的棍子。
2:调节阈值。如果你不熟悉rgb,这一步似乎不太容易。点击你用的棍子(图中1处),在图中2处有rgb显示,多点几下,看看大致范围。然后调节图中4处rgb阈值。如果选中对应的多选框,表示你的棍子的这个分量小于阈值,否则表示大于。图示中,我用的是红色主调,于是R不选中,G、B选中。调整要达到的效果是,使图中3处清晰显示你棍子的位置,不是棍子的区域尽量减少
3:在图中5处,选择你喜欢的颜色。我做了六种简单的效果,你可以自己做更漂亮的替换之
4:图中6处可以关掉光剑显示
5:图中7处是为方便调试时做的,可以显示程序寻找棍子的线
不一定非得是棍子,我用的方法是拟合最大目标区域的直线
我的摄像头是640*480的,如果你的是320*240或别的,显示窗口可能不一样,但都可以玩
下面是几个截图:
垃圾铲
用手玩
光剑的几种效果:
欢迎朋友们给点意见!
==============================================================================
update:
非常感谢wo_men123456在评论中的意见:
wo_men123456:霍夫直线检测后,在用dx画
今天我又用直线检测做了一下,刚做的时候用canny边缘检测,效果出来时才意识到棍子有两条边,而本程序需要的不仅是直线,而且应该是中线。于是后又采用细化处理+hough检测,效果不错。
但想来直线检测和我原来采用的直线拟合就在本程序中的应用而言还是有区别的:
因为光照的不断变化,阈值化后的图像在相邻帧之间也会不同,不同之处主要在目标边缘部分.
于是细化得出的线主要在两端出变化较大(图像端点处的结构对细化结果影响是比较大的),这样,这条线就不能很好地表示棍子。而hough直线检测,因为只是检测这一条线,给出的直线斜率变化较快,在光剑程序中就显得不太适合。
而直线拟合的方法因为使用了棍子的所有点,在试验中直线表现更为稳定,即斜率变化平滑。
我原来方法的不足之处:要求目标区域是连通的。
目标出现小距离中断时,检测到的直线段会突然变短,而hough直线检测可以较好地避免这个问题。解决方法是在检测连通域时扩大像素连接的距离。不过随之而来的是效率在一定程度上的下降。
hough直线检测法代码下载:http://download.csdn.net/source/2977153
单帧效果比较:
1、细化+hough直线检测
2、canny边缘+hough直线
3、我原本的方法:直线拟合