kinect 彩色、深度、骨骼和用户抠图结合

要实现目标:整合前面所说的彩色图像、深度图像和骨骼图像,就是实现和SDK自带的那个SkeletonView例程差不多的功能。另外,再增加用户抠图功能,这个功能和SDK自带的那个Green Screen功能差不多。我们通过OpenCV来显示。

一、编程前期分析

这里因为是整合前面几个学习笔记提到的功能,所以要了解的东西前面都已经了解了,这里就不赘述了。这里唯一有一个新的点就是用户抠图,我们再学习学习。

那么叫抠图啊?用过Photoshop或者AE等一般的图像或者视频处理软件的人应该不会陌生。所谓抠图,就是把图片或影像的某一部分从原始图片或影像中分离出来成为单独的图层。主要功能是为了后期的合成做准备。如果还不了解的话,我们看过科幻电影或者一个特效视频吧?某个人在恐龙旁边、某个人在悬崖边打架、某个人在天上飞等等,这些场景大家有没有想过它是怎样实现的啊?难道真的是实景拍的?你都会说了“怎么可能!”。实际上很大一部分就是采用抠图这个技术的,如果搞视频特效处理的话,这个技术行业内好像叫“键控”。它在电视制作和电影制作中很常见,这种技术叫做绿屏抠像,就是演员或者播音员站在绿色底板前,然后录完节目后,绿色背景抠出,换成其他场景,在一些科幻电影中演员不可能在实景中表演时常采用的造景手法。

在Kinect中我们也可以达到类似的效果。Kinect SDK使得这个很容易实现。这实际上就是现实增强的一个基本例子,现实增强应用非常有趣而且能够获得非常好的用户体验。许多艺术家使用Kinect来进行现实增强交互展览。另外,这种技术也通常作为广告和营销的工具。

 

Code

三、代码解析

这里,在对前面所说的彩色图像、深度图像和骨骼图像的整合功能的实现上,就是通过整合前面工作的代码而已(请参考之前的博文)。然后唯一有一个新的东西就是抠图,我们需要把用户扣出来,显示与背景不一样的颜色,具体的函数就是:

void getTheContour(Mat &image, int whichone, Mat &mask);

调用它的时候,传入的是深度图像image,我们在深度图像处理的时候,也就是getDepthImage 函数里面对深度数据已经做了处理,已经将玩家的ID数据转换为RGBQUAD 格式的数据了,所以用户的ID数据已经隐含的在深度图像的每个像素中表示了,所以这里我们只需要分析每个像素的RGB值就可以对应的知道是哪个ID了,那么属于某个ID的像素我们就用某种颜色来表示,其他背景像素我们就用蓝色来表示。这样就完成了抠图。

实际上,我们之前提到的getDepthImage 函数就是处理深度数据的每一个像素,如果属于同一个用户的ID,那么像素就标为同种颜色,不同的用户,其ID不一样,颜色的标示也不一样,如果不属于某个用户的像素,那么就采用原来的深度值,而getTheContour函数实际上就是这里不一样而已。“如果不属于某个用户的像素,那么就采用原来的深度值”,这里改为“如果不属于某个用户的像素,那么就将像素值赋值为蓝色”。

既然你都把用户扣出来了,那么把他弄到你给定的一个图片场景里面应该不难了吧。呵呵,相信大家都有各种办法的。

至此,本文的目标就达到了,下面是结果。其实右边是彩色图像,在彩色图像里面用户的骨架也是被标注出来的,只是本人不宜抛头露面,所以就抛弃这部分的截图了。

另外,感觉到这里,Kinect SDK能提供的基本数据我们会获取了,也就是勉勉强强把地基打好了,那么后面的工作就是在上面创造属于你的世界了。我们后面会学习基于Kinect的姿态、手势识别等等的内容,通过他们去构建良好的人机交互程序。

posted @ 2012-12-09 16:13  代码改编世界  阅读(2282)  评论(0编辑  收藏  举报