转载于:https://blog.csdn.net/dustpg/article/details/38089745
使用SDK: Kinect for Windows SDK v2.0 public preview
CSND博客出现了已经发布了,修改了一个字就变成“待审核”状态导致慢更了,
不过反正几乎没人看也就影响为0啦。
这次说的是Kinect的玩家索引(BodyIndex)。
Kinect用一个字节表示当前深度坐标的玩家编号。目前最大支持6人,已经是非常不错了,这个“6”是一个宏定义
- #define BODY_COUNT 6
获得的字节流中,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等等。详细的可以看范例。
效果如下:
哎,一个人截图简直不方便,就这样变学姐了。
还有就是提供的范例中,一个解决方案包含了这两个工程,需要调试某工程需要右键工程--设置启动项
范例下载地址:点击这里
- 本文已收录于以下专栏:
- Kinect for Windows SDK v2.0 开发笔记
转载于:https://blog.csdn.net/dustpg/article/details/38089745
使用SDK: Kinect for Windows SDK v2.0 public preview
CSND博客出现了已经发布了,修改了一个字就变成“待审核”状态导致慢更了,
不过反正几乎没人看也就影响为0啦。
这次说的是Kinect的玩家索引(BodyIndex)。
Kinect用一个字节表示当前深度坐标的玩家编号。目前最大支持6人,已经是非常不错了,这个“6”是一个宏定义
- #define BODY_COUNT 6
获得的字节流中,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等等。详细的可以看范例。
效果如下:
哎,一个人截图简直不方便,就这样变学姐了。
还有就是提供的范例中,一个解决方案包含了这两个工程,需要调试某工程需要右键工程--设置启动项
范例下载地址:点击这里