`
isiqi
  • 浏览: 16118474 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

未来游戏新趋势——野比的视频体感游戏实验《抓住板砖》

 
阅读更多


作者:野比 (conmajia@gmail.com

时间:May, 2012

封面图片为野比原创,请勿未经允许私自引用


Nobi's Somatosensory Game -- Catch the Brick

野比的体感游戏 —— 抓住板砖

写在前面的话:这纯粹是个实验小品,妄称游戏,娱乐而已,不要当真。做这个东西的原因,其一在于对体感游戏的兴趣,其二也是为了练习使用Emgu CV。希望通过这篇文章,抛砖引玉,能够激发出大家创造的激情。希望能有更多更好的关于体感控制方面的精品出现!


====>源代码下载<====


要使用源代码,请先安装Emgu CV(请找度娘索取),并且把bin目录添加到系统变量中。如果不行或者不会,就把bin下面的所有dll文件复制到C:\Windows\system32里去。

源代码里面有一个BitmapEx,是增强的System.Drawing.Bitmap,用到指针来进行GetPixel()和SetPixel(),性能比Bitmap好不少。

BitmapEx的代码如下。

  1. /**********************************************
  2. *ExtendedBitmapClass
  3. *增强型位图类
  4. *--------------------------------------------
  5. *野比春熊
  6. *conmajia@gmail.com
  7. *May13th,2012Mother'sDay
  8. *--------------------------------------------
  9. *YouMAYABLETOUSE,DUPLICATEthisprogram.
  10. *ButyouMAYNOTMODIFYitWITHOUTmyper-
  11. *mission.
  12. *(Haha,justajoke.Yougotthisfile,you
  13. *goteverythingalready.)
  14. *Useasyouwish.Youcandonatetomeif
  15. *youfeelgrateful.
  16. ********************************************/
  17. usingSystem;
  18. usingSystem.Collections.Generic;
  19. usingSystem.Text;
  20. usingSystem.Drawing.Imaging;
  21. usingSystem.Drawing;
  22. namespaceSpringbearWorks.Image
  23. {
  24. ///<summary>
  25. ///增强位图类。
  26. ///</summary>
  27. ///<remarks>
  28. ///高性能Bitmap类。
  29. ///</remarks>
  30. publicclassBitmapEx:IDisposable,ICloneable
  31. {
  32. #region字段
  33. internalBitmap_bitmap;
  34. BitmapData_bitmapData;
  35. #endregion
  36. #region构造与析构
  37. privateBitmapEx(){}
  38. publicBitmapEx(intwidth,intheight,PixelFormatformat)
  39. {
  40. _bitmap=newBitmap(width,height,format);
  41. }
  42. ~BitmapEx()
  43. {
  44. Dispose(false);
  45. }
  46. publicvoidDispose()
  47. {
  48. GC.SuppressFinalize(this);
  49. Dispose(true);
  50. }
  51. protectedvirtualvoidDispose(booldisposing)
  52. {
  53. Unlock();
  54. if(disposing)
  55. {
  56. _bitmap.Dispose();
  57. }
  58. }
  59. #endregion
  60. #region方法
  61. publicobjectClone()
  62. {
  63. BitmapExclone=newBitmapEx();
  64. clone._bitmap=(Bitmap)_bitmap.Clone();
  65. returnclone;
  66. }
  67. publicintWidth
  68. {
  69. get{return_bitmap.Width;}
  70. }
  71. publicintHeight
  72. {
  73. get{return_bitmap.Height;}
  74. }
  75. publicvoidLock()
  76. {
  77. _bitmapData=_bitmap.LockBits(
  78. newRectangle(0,0,_bitmap.Width,_bitmap.Height),
  79. ImageLockMode.ReadWrite,
  80. _bitmap.PixelFormat
  81. );
  82. }
  83. unsafepublicColorGetPixel(intx,inty)
  84. {
  85. if(_bitmapData.PixelFormat==PixelFormat.Format32bppArgb)
  86. {
  87. byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*4);
  88. returnColor.FromArgb(*(b+3),*(b+2),*(b+1),*b);
  89. }
  90. if(_bitmapData.PixelFormat==PixelFormat.Format24bppRgb)
  91. {
  92. byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*3);
  93. returnColor.FromArgb(*(b+2),*(b+1),*b);
  94. }
  95. returnColor.Empty;
  96. }
  97. unsafepublicvoidSetPixel(intx,inty,Colorc)
  98. {
  99. if(_bitmapData.PixelFormat==PixelFormat.Format32bppArgb)
  100. {
  101. byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*4);
  102. *b=c.B;
  103. *(b+1)=c.G;
  104. *(b+2)=c.R;
  105. *(b+3)=c.A;
  106. }
  107. if(_bitmapData.PixelFormat==PixelFormat.Format24bppRgb)
  108. {
  109. byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*3);
  110. *b=c.B;
  111. *(b+1)=c.G;
  112. *(b+2)=c.R;
  113. }
  114. }
  115. publicByteGetIntensity(intx,inty)
  116. {
  117. Colorc=GetPixel(x,y);
  118. return(byte)((c.R*0.30+c.G*0.59+c.B*0.11)+0.5);
  119. }
  120. publicvoidUnlock()
  121. {
  122. if(_bitmapData!=null)
  123. {
  124. _bitmap.UnlockBits(_bitmapData);
  125. _bitmapData=null;
  126. }
  127. }
  128. publicvoidSave(stringfilename,ImageFormatformat)
  129. {
  130. _bitmap.Save(filename,format);
  131. }
  132. publicvoidSave(stringfilename)
  133. {
  134. _bitmap.Save(filename);
  135. }
  136. #endregion
  137. }
  138. }

在项目中添加现有项,把Form1.cs和Form1.Designer.cs一起加入,使其为启动的主窗体,即可开始调试本程序。

游戏原理很简单,就这这几个步骤。

  1. 对背景采样(注意不能有运动物体)
  2. 从视频里减去背景(剩下的就是伟岸的你了)
  3. 二值化剪影
  4. 读取板砖范围内的像素点,和剪影交叉超过20%则认为被点击
  5. 5.如此这般

上面第4步,按照我设想的其实应该分成a.查找剪影边界,生成Region,b.求板砖和Region的交集,若不为空,则认为相交。现在这种算法效率太低。

实际操作时发现AForge的边缘检测算法似乎对我电脑上130w的摄像头有点勉为其难,效果相当不好。

无所谓了,反正是玩嘛。于是就用遮罩+XOR提取了运动图像部分(人)。

游戏攻略:

  1. 使用身体任何一个部分去碰触红色板砖即可。
  2. 永远不要妄想能抓住板砖。

下面来个游戏动画图。



欢迎指正!

关于体感游戏的一些思考

体感游戏,从Wii打响第一枪开始至今已经很多年了。NDS的吹气玩法,Microsoft的Kinect等等,无不在提醒着我们,体感控制,正在日趋完善。

前段时间看到一个科技视频,美国科学家使用布置在房间、手持的多个摄像机、投影仪同步,然后实时生成房间、物品和人的3D数据模型,实现了人体体感控制任意虚拟物品的科幻效果。


视频链接:点击访问


作者:野比 (conmajia@gmail.com

时间:May, 2012

(全文完)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics