作者:野比 (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的代码如下。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
usingSystem;
-
usingSystem.Collections.Generic;
-
usingSystem.Text;
-
usingSystem.Drawing.Imaging;
-
usingSystem.Drawing;
-
-
namespaceSpringbearWorks.Image
-
{
-
-
-
-
-
-
-
publicclassBitmapEx:IDisposable,ICloneable
-
{
-
#region字段
-
internalBitmap_bitmap;
-
BitmapData_bitmapData;
-
#endregion
-
-
#region构造与析构
-
privateBitmapEx(){}
-
-
publicBitmapEx(intwidth,intheight,PixelFormatformat)
-
{
-
_bitmap=newBitmap(width,height,format);
-
}
-
-
~BitmapEx()
-
{
-
Dispose(false);
-
}
-
-
publicvoidDispose()
-
{
-
GC.SuppressFinalize(this);
-
Dispose(true);
-
}
-
-
protectedvirtualvoidDispose(booldisposing)
-
{
-
Unlock();
-
if(disposing)
-
{
-
_bitmap.Dispose();
-
}
-
}
-
#endregion
-
-
#region方法
-
publicobjectClone()
-
{
-
BitmapExclone=newBitmapEx();
-
clone._bitmap=(Bitmap)_bitmap.Clone();
-
returnclone;
-
}
-
-
publicintWidth
-
{
-
get{return_bitmap.Width;}
-
}
-
-
publicintHeight
-
{
-
get{return_bitmap.Height;}
-
}
-
-
publicvoidLock()
-
{
-
_bitmapData=_bitmap.LockBits(
-
newRectangle(0,0,_bitmap.Width,_bitmap.Height),
-
ImageLockMode.ReadWrite,
-
_bitmap.PixelFormat
-
);
-
}
-
-
unsafepublicColorGetPixel(intx,inty)
-
{
-
if(_bitmapData.PixelFormat==PixelFormat.Format32bppArgb)
-
{
-
byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*4);
-
returnColor.FromArgb(*(b+3),*(b+2),*(b+1),*b);
-
}
-
if(_bitmapData.PixelFormat==PixelFormat.Format24bppRgb)
-
{
-
byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*3);
-
returnColor.FromArgb(*(b+2),*(b+1),*b);
-
}
-
returnColor.Empty;
-
}
-
-
unsafepublicvoidSetPixel(intx,inty,Colorc)
-
{
-
if(_bitmapData.PixelFormat==PixelFormat.Format32bppArgb)
-
{
-
byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*4);
-
*b=c.B;
-
*(b+1)=c.G;
-
*(b+2)=c.R;
-
*(b+3)=c.A;
-
}
-
if(_bitmapData.PixelFormat==PixelFormat.Format24bppRgb)
-
{
-
byte*b=(byte*)_bitmapData.Scan0+(y*_bitmapData.Stride)+(x*3);
-
*b=c.B;
-
*(b+1)=c.G;
-
*(b+2)=c.R;
-
}
-
}
-
-
publicByteGetIntensity(intx,inty)
-
{
-
Colorc=GetPixel(x,y);
-
return(byte)((c.R*0.30+c.G*0.59+c.B*0.11)+0.5);
-
}
-
-
publicvoidUnlock()
-
{
-
if(_bitmapData!=null)
-
{
-
_bitmap.UnlockBits(_bitmapData);
-
_bitmapData=null;
-
}
-
}
-
-
publicvoidSave(stringfilename,ImageFormatformat)
-
{
-
_bitmap.Save(filename,format);
-
}
-
-
publicvoidSave(stringfilename)
-
{
-
_bitmap.Save(filename);
-
}
-
#endregion
-
}
-
}
在项目中添加现有项,把Form1.cs和Form1.Designer.cs一起加入,使其为启动的主窗体,即可开始调试本程序。
游戏原理很简单,就这这几个步骤。
-
对背景采样(注意不能有运动物体)
-
从视频里减去背景(剩下的就是伟岸的你了)
-
二值化剪影
-
读取板砖范围内的像素点,和剪影交叉超过20%则认为被点击
-
5.如此这般
上面第4步,按照我设想的其实应该分成a.查找剪影边界,生成Region,b.求板砖和Region的交集,若不为空,则认为相交。现在这种算法效率太低。
实际操作时发现AForge的边缘检测算法似乎对我电脑上130w的摄像头有点勉为其难,效果相当不好。
无所谓了,反正是玩嘛。于是就用遮罩+XOR提取了运动图像部分(人)。
游戏攻略:
-
使用身体任何一个部分去碰触红色板砖即可。
-
永远不要妄想能抓住板砖。
下面来个游戏动画图。
欢迎指正!
关于体感游戏的一些思考
体感游戏,从Wii打响第一枪开始至今已经很多年了。NDS的吹气玩法,Microsoft的Kinect等等,无不在提醒着我们,体感控制,正在日趋完善。
前段时间看到一个科技视频,美国科学家使用布置在房间、手持的多个摄像机、投影仪同步,然后实时生成房间、物品和人的3D数据模型,实现了人体体感控制任意虚拟物品的科幻效果。
视频链接:点击访问
作者:野比 (conmajia@gmail.com)
时间:May, 2012
(全文完)
分享到:
相关推荐
NobiSomatosensoryGame野比的体感游戏实验抓住板砖NobiSomatosensoryGame野比的体感游戏实验抓住板砖
Nobi's Somatosensory Game:Catch the Brick 野比的体感游戏:抓住板砖,利用摄像头游戏,需要Emgu CV支持。
一个基于Unity3d游戏引擎的体感游戏研究与实现.doc
安卓移动体感的案例源码,体感游戏时一种通过肢体动作变化来进行操作的新型电子游戏。Android移动体感包括体感游戏功能但不局限于游戏,而是将体感应用到大部分的应用程序中,对PC上的普通程序也能进行体感控制。该...
体感游戏xPPT课件.pptx
体感AR体感游戏.mp4
网络游戏-体感互动游戏装置及体感在线互动系统.zip
实现了手势识别连线,人机交互,是学习Kinect体感的基础入门代码
基于FPGA的体感游戏.pdf
什么叫游,戏游戏的定义,体感游戏,体感游戏开发
暖场体感游戏活动学习教案.pptx
暖场体感游戏活动PPT课件.pptx
如果您是一位射击游戏爱好者,刚好拥有一把锐火体感游戏枪,那么这个驱动程序可能是您需要的。
体感游戏机的制作方法.docx
青少年编程图形化软件scratch,体感小游戏,通过摄像头捕捉动作,来感知动作变化,以实现对水果的切除效果。
网络游戏-基于游戏引擎的4D体感交互系统.zip
camspace是一款可以让人们不用鼠标、键盘、手柄也能玩游戏,想想打CS的时候空手作枪状就能开火,多么开心呐。 不用这些输入设备用什么呢?摄像头,就是普通的摄像头,再配合camspace的软件,随便拿起什么,比如,一...
本资源为STM32嵌入式课程设计游戏手柄实验,库函数版本,内含全部代码。 实验现象: 本实验主程序不停的扫描FC手柄的输入,一旦检测到有效输入,那么就将该输入值在TFTLCD模块上面显 示,同时显示对应的符号(比如...