一名热爱体感技术的
业余专业开发人员

使用OpenCV显示KinectV2数据

这次给大家分享下我自己写的KinectV2的OpenCV项目,可以用于研究KinectV2图像算法的人。项目地址在我的Github页面。另外还有更复杂的OpenCV显示KinectV2人脸追踪的项目,适用于研究人脸追踪Face Tracking、人脸识别Face Recognition、人脸特征点提取Face Alignment,就不提供源码了,有需要请去我的淘宝店询问后购买。

相对于我以前给出的OpenCV程序,这个程序的好处是不用配置OpenCV环境,直接可以编译运行。不了解如何做到这点的同学,可以下载学习下这种配置方法。欢迎,留言或分享你的代码。

程序适用人群

  • 学术研究、图像处理算法研究者

程序功能:

  • 使用OpenCV显示KinectV2数据

开发环境:

  • win32控制台应用程序 x86程序 (程序类型)
  • VisualStudio 2013 (开发工具)
  • KinectSDK-v2.0-PublicPreview1409-Setup (Kinect SDK驱动版本, http://brightguo.com/kinect2)
  • Windows 8.1 (操作系统)
  • OpenCV2.4.10

这里列出最重要的两个文件,完整项目请去Github上查看:

Kinect.h

 

Kinect.cpp

 

需要注意的是,Skeleton我并没有做显示处理,仅仅是存储了数据,有需要的人自己想办法显示喽。本程序最终结果图像:

QQ20150413213525_

 

以下图片是网友visitor538791785通过map color 到depth得到的图像(就是找到color图像中对应的深度数据,很显然由于摄像头视差color图像不可能都能找到对应的深度数据,对于无效值他用红色标识出来了。),相关代码可以看评论区找到:

pLU2mvf_png

评论 22

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #9

    谢谢帮助哈,我已经弄好了,和同学的比对之后知道这就是正确结果。

    visitor5387917852年前 (2016-05-24)回复
    • 不用谢,欢迎多交流多分享!~~

      小明2年前 (2016-05-25)回复
  2. #8

    我又加上了博客中的// Values that are negative infinity means it is an invalid color to depth mapping so we
    // skip processing for this pixel
    if (p.X != -std::numeric_limits<float>::infinity() && p.Y != -std::numeric_limits<float>::infinity()) 这句代码来判断数据是否有效,将不满足此if的像素置为红色,可以得到下图的结果,由此看来就是对无效数据的忽略导致了有大片黑影,有没有什么办法去掉这个影子?难道这就是对齐结果了?

    visitor5387917852年前 (2016-05-22)回复
  3. #7

    可能吧,但是和无效的数据比到底都算false还是都算true呢,我没试过~

    guoming00002年前 (2016-05-22)回复
  4. #6

    哦,,我好像懂了,,我用if ((depthPoint.X >= 0) && (depthPoint.X < 512) && (depthPoint.Y >= 0) && (depthPoint.Y < 424))
    {rgbdImg.at<uchar>(i, j) = depthImg.at<uchar>(depthPoint.Y, depthPoint.X);} 这种方法处理的话,有数据部分就能得到深度数据,无数据部分就被自动忽略了,所以就是黑色,因此后脑勺这些灰度摄像头中未采集到信息的地方就有黑影,,我明天试试将不满足if条件的部分赋为红色,看看是不是恰好是后脑勺部分是红色,这样子就可以验证一下了。等我拿到数据给你发图哈,

    visitor5387917852年前 (2016-05-21)回复
  5. #5

    你看得到我后面附上的对齐和画图的代码吗?你说的那种情况肯定是存在的,但是我认为if ((depthPoint.X >= 0) && (depthPoint.X < 512) && (depthPoint.Y >= 0) && (depthPoint.Y < 424))这一句就应该是在处理无效坐标,解决你提到的这个问题吧,。。 @guoming0000

    visitor5387917852年前 (2016-05-21)回复
  6. #4

    请问一下,我按照你的MapColorFrameToDepthSpace这个方法来映射彩图和深度图的坐标,想要自己做一个深度和彩色的对齐,“对齐”图像的人物的边缘有很宽的空洞,如下图,右边是原始深度图像,坐标是从彩色图映射之后得到的“对齐”图像(本应该是1920*1080,我用opencv来resize了一下)。明显可以看到后脑勺部分很大一块黑色的重影。。。请问博主知道这是什么原因么

    visitor5387917852年前 (2016-05-21)回复
    • 关键的对齐和画图的代码,如下:
      if (SUCCEEDED(hr)){
      rgbdImg.create(cColorHeight, cColorWidth, CV_8UC1); rgbdImg.setTo(0);
      mapper->MapColorFrameToDepthSpace(cDepthWidth * cDepthHeight, (UINT16*)pDepthBuffer, cColorWidth * cColorHeight, dpoint);
      for (int i = 0; i < 1080; i++){
      for (int j = 0; j < 1920; j++){
      DepthSpacePoint depthPoint = dpoint[i * 1920 + j];
      if ((depthPoint.X >= 0) && (depthPoint.X < 512) && (depthPoint.Y >= 0) && (depthPoint.Y < 424))
      {
      rgbdImg.at<uchar>(i, j) = depthImg.at<uchar>(depthPoint.Y, depthPoint.X);
      }
      }
      }
      Mat rgbd; resize(rgbdImg, rgbd, Size(1920 / 3, 1080 / 3));
      imshow(rgbd, rgbd);
      }

      visitor5387917852年前 (2016-05-21)回复
    • 我也不是很懂,我猜测下,首先摄像头看到的画面肯定不同,毕竟还是差几厘米。那么在边上的深度摄像头肯定看不到一些彩色摄像头看得到的地方,这个地方肯定是被物体挡住对吧。在后脑勺部分,深度摄像头看不到那块,彩色摄像头却能看到。我这里没有看到你对于无效坐标的处理,投影后会产生很多无效坐标(使用isnan()函数判断),你把这些无效坐标的颜色设置为红色看看(这样图像得使用rgb显示,而不是gray),我估计头后面应该是红色的,可以的话发个图给我i@brightguo.com,我附在文章后面。

      guoming00002年前 (2016-05-21)回复
      • 你看得到我后面附上的对齐和画图的代码吗?你说的那种情况肯定是存在的,但是我认为if ((depthPoint.X >= 0) && (depthPoint.X < 512) && (depthPoint.Y >= 0) && (depthPoint.Y < 424))这一句就应该是在处理无效坐标,解决你提到的这个问题吧,。。

        visitor5387917852年前 (2016-05-21)回复
  7. #3

    获取方式有多种,这也是官方支持的一种,当然是没啥区别了

    小明2年前 (2016-05-04)回复
  8. #2

    看到你的代码先读取MultiSource,在通过FrameReference找到彩色、深度、body等数据源,请问这样和官方例子中直接读取单独的数据源有什么区别??

    刘冬2年前 (2016-05-04)回复
  9. #1

    请问下有kinect v2的深度图和彩色图对准的相关代码吗?网上都是一代的

    刘晓晶3年前 (2015-11-30)回复
    • 有函数直接调用的啊,kinectv2安装完sdk后的例子中也有代码啊….网上很多2代代码的哦,你好好搜下呗

      小明3年前 (2015-11-30)回复
      • 我使用了网上的代码,发现对齐效果不是很好。谢谢啦

        刘晓晶3年前 (2016-01-05)回复
        • 是指的我的网站的嘛?最近网站频繁出问题,我已经关掉大部分功能,所以代码也不对齐了。

          小明3年前 (2016-01-05)回复