http://blog.csdn.net/onezeros/article/details/6124073

前几天写了一个可以玩儿光剑的程序,个人觉得很酷

这个程序你完全可以在自己电脑上玩玩,很有星球大战中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、我原本的方法:直线拟合

可以让你玩儿光剑的程序,vc实现方法和代码相关推荐

  1. OpenGL程序VC框架:Bezier 曲线

    OpenGL程序VC框架:Bezier 曲线 下面以画一条 Bezier 曲线为例,详细介绍VC++ 上 OpenGL编程的方法.文中给出了详细注释,以便给初学者明确的指引.一步一步地按所述去做,你将 ...

  2. C++程序代码优化的方法

    1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多.数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组 ...

  3. 一种巧妙的删除程序自己的方法

    一种巧妙的删除程序自己的方法     大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了.在Lu0的主页上看到一种UNDOC ...

  4. java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  5. VC++调试方法和技巧

    VC++调试方法和技巧 便于调试的代码风格: 1.       不用全局变量: 2.       所有变量都要初始化,成员变量在构造函数中初始化: 3.       尽量使用const: 4.     ...

  6. 终止js程序执行的方法

    js终止程序执行的方法共有三种 (一)在function里面(普通js方法) (1)return; (2)return false; (二)非function方法里面(如ajax方法) alert(& ...

  7. java程序员可以只用windos吗_程序员要写多少代码 才能开发一个window操作系统

    开发一个window操作系统需要程序员写多少行代码呢? 微软的Windows系统是伴随我们已久的老朋友了,大多数人都是一代一代Windows的用上来,老用户几乎都形成一个共识,就是微软的系统有一代会很 ...

  8. Xposed: 勾住(Hook) Android应用程序对象的方法,实现AOP

    Xposed Xposed能够勾住(Hook) Android应用程序对象的方法,实现AOP,一个简单的例子: public class WebViewHook implements IXposedH ...

  9. python表白代码如何运行-程序员如何实现表白代码

    程序员实现表白代码的方法:首先打开代码编辑器:然后输入告白代码[while (life < end) {love++;},var you = function from_future_impor ...

最新文章

  1. 论文免费开源:NB-IoT智慧路灯监控系统
  2. 提高IIS网站服务器的效率的八种方法 (转载)
  3. 技术性图文还原那些腿长得能改变地球引力场的TB奇女子
  4. MathWorks.MATLAB.NET.Arrays.MWArray”的类型初始值设定项引发异常 解决方法
  5. java 对象 方法_java——类、对象、方法
  6. 深入浅出python机器学习_8.3_神经网络实例_手写识别_MNIST数据集的使用
  7. Demo:充分利用 Ajax 技术 来体现页面局部刷新 效果(获取天气预报情况)
  8. 在python中value是啥意思_【Python】python,字典中如何根据value值取对应的key值
  9. 语音识别学习日志 2019-7-15 语音识别基础知识准备4 {Baun-Welch算法}
  10. 深度学习(二十二)Dropout浅层理解与实现
  11. 省市区 / 三级联动
  12. 就算是一件小事也要做好——买土豆的故事
  13. 加一(Java求解)
  14. 截取字符串时,截取完整的表情符
  15. 名额有限| 和喜马拉雅、网易严选、大搜车...学运营,是超级用户运营!
  16. 【基于TensorFlow2.3.0的果蔬识别系统的设计】
  17. GSM通话断续问题分析
  18. SQL Server 下取中位数(中位值)的方法
  19. 美国最佳本科计算机科学,美国本科计算机科学专业排名
  20. 爱码物联 二维码营销Saas平台_为中小微企业而生

热门文章

  1. 在OpenCV环境下写的两个图像平移C和C++源代码
  2. Perl内置及特殊变量
  3. leetcode算法题--叶值的最小代价生成树
  4. iphone屏幕镜像连电视_三种投屏方法,让电视电脑也能显示iPhone画面,大屏游戏视频更佳...
  5. 如何使WINCE启动时自动运行应用程序
  6. Git record
  7. 即使连网了ping也会失败
  8. js改变iframe链接
  9. redhat下配置SEED DVS6446开发环境3
  10. RTT 动态线程和静态线程