Kinect for Windows SDK v2.0 开发笔记 (四)玩家索引与绿屏技术

(转载请注明出处)

使用SDK: Kinect for Windows SDK v2.0 public preview

CSND博客出现了已经发布了,修改了一个字就变成“待审核”状态导致慢更了,

不过反正几乎没人看也就影响为0啦。

这次说的是Kinect的玩家索引(BodyIndex)。


Kinect用一个字节表示当前深度坐标的玩家编号。目前最大支持6人,已经是非常不错了,这个“6”是一个宏定义

#define BODY_COUNT 6
支持6人索引及6人骨骼跟踪,1代支持6人索引但是只支持2人骨骼跟踪,可见USB3.0的功劳。

获得的字节流中,0x00表示0号玩家,0x01表示1号,直到0x05这6名玩家索引,没有玩家则是用 0xFF表示。请注意,

玩家索引是随机分配的,不是只有一位玩家就编号是0x00。不过经测试,貌似一位玩家用0x00表示的几率要大些。


这次可视化算法就简单了,6名玩家使用3比特位即可表示,刚好RGB三种3颜色,所以就用下面代码:


        for (UINT i = 0; i < nBufferSize; ++i){
            pBGRXBuffer[i].rgbBlue = pBuffer[i] & 0x01 ? 0x00 : 0xFF;
            pBGRXBuffer[i].rgbGreen = pBuffer[i] & 0x02 ? 0x00 : 0xFF;
            pBGRXBuffer[i].rgbRed = pBuffer[i] & 0x04 ? 0x00 : 0xFF;
            pBGRXBuffer[i].rgbReserved = 0xFF;
        }

这样,0x00号就是白色,0xFF就是黑色,方便观看。请注意,Kinect的核心算法基于深度图像,

所以获得的玩家索引的大小也是与深度图像大小一致,同上节,方法名差不多,“DepthFame”改为"BodyIndexFrame"就差不多了。

效果如下:


可以看到在近距离,深度图像分辨率大于手指,没准微软在以后近景模式中会提供官方的十指跟踪。

当然大家自己可以利用OpenCV基于深度图像实现手指位置的跟踪。


看一下这个图像,如果与彩色图像像相结合,就可以把人物将彩色图像中“分离”出来,这个有点像电影电视

中的“色键”,在背景使用绿色或者蓝色图像,后期处理把这些背景色移除。在这就成为绿屏技术吧。


算法大致如下:

这个点索引为0xFF就把像素置为空(0x00000000),否则置为在这个点彩色帧相应位置。

那么怎么获取“这个点彩色帧相应位置”呢?Kinect SDK提供了一个坐标映射对象。是的,居然是对象,

而不是一个函数搞定的事发火

还有就是只要是关于深度数据的坐标映射,是要提供源数据(即深度数据)的。

原来不是一个简单的f(x)啊。

坐标映射提供非常多的映射方法,像深度坐标映射彩色坐标,彩色坐标映射深度坐标,详细的情查看官方文档

还有一点需要注意,就是可能会出现坐标映射改变的情况,比如彩色帧大小从1080P变成720P。

不过现在还不能,于是ICoordinateMappingChangedEventArgs里边也是几乎啥也没有。也就是目前还不用管


所现在我们需要同时开启彩色数据流,深度数据流已经玩家索引数据流。同步这个流不是一个简单的事。

毕竟我们不知道什么流先到,什么流后到。于SDK提供一个“复源帧”对象,将多个数据流封到一起,用起来非常方便。

使用IKinectSensor::OpenMultiSourceFrameReader(DWORD, IMultiSourceFrameReader **)打开复源帧,比如:

        hr = m_pKinect->OpenMultiSourceFrameReader(
            FrameSourceTypes::FrameSourceTypes_Color | 
            FrameSourceTypes::FrameSourceTypes_BodyIndex |
            FrameSourceTypes::FrameSourceTypes_Depth,
            &m_pMultiSourceFrameReader
            );
打开彩色数据流+深度数据流+玩家索引流,使用方法和单源帧差不多,不过使用时要获取你需要的单源帧引用,

比如IMultiSourceFrame::get_ColorFrameReference,IMultiSourceFrame::get_DepthFrameReference等等。详细的可以看范例。


效果如下:


哎,一个人截图简直不方便,就这样变学姐了。大哭


还有就是提供的范例中,一个解决方案包含了这两个工程,需要调试某工程需要右键工程--设置启动项



范例下载地址:点击这里


发布了35 篇原创文章 · 获赞 18 · 访问量 21万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览