博客
关于我
Kinect2+opencv之Body篇:显示Kinect2的Body
阅读量:314 次
发布时间:2019-03-04

本文共 8017 字,大约阅读时间需要 26 分钟。

目录

  • 显示Kinect2的Body
  • Kinect2+opencv之Color篇:显示Kinect2的画面
  • Kinect2+opencv之Depth篇:显示Kinect2的深度图
  • Kinect2+opencv之BodyIndex:显示Kinect2的BodyIndex
  • 创建MFC工程,配置Kinect2和Opencv的环境
  • 头文件
  • 测试Kinect代码
  • cpp源文件文件
  • 运行效果
  • 一、目的

    本文旨在通过Kinect2与OpenCV的结合,展示如何实现Kinect2的Body、Color、Depth以及BodyIndex的显示。通过实际代码和详细步骤,帮助读者理解如何利用这两种技术进行图像处理和人体数据分析。

    二、参考

  • 了解Kinect2的开发环境搭建及其与OpenCV的集成。
  • 学习如何使用Kinect2的深度传感器和Color摄像头获取图像数据。
  • 掌握如何处理和显示获取的Body、Color、Depth和BodyIndex数据。
  • 三、步骤

    1. 创建MFC工程,配置Kinect2和Opencv的环境

    这一步需要通过网络资源或教程完成,涉及Kinect2的驱动安装、开发环境的配置以及OpenCV的安装。

    2. 头文件

    在项目中需要导入以下头文件:

    • Kinect.h
    • opencv.h
    • cv.h

    3. 测试Kinect代码

    以下是用于测试Kinect2功能的代码示例:

    int Test_kinect2()  {      // 获取Sensor接口      IKinectSensor* pSensor = nullptr;      HRESULT hResult = S_OK;      hResult = GetDefaultKinectSensor(&pSensor);      if (FAILED(hResult))      {          std::cerr << "Error : GetDefaultKinectSensor" << std::endl;          return -1;      }      hResult = pSensor->Open();      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::Open()" << std::endl;          return -1;      }      // 获取Body Frame Source      IBodyFrameSource* pBodySource = nullptr;      hResult = pSensor->get_BodyFrameSource(&pBodySource);      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::get_BodyFrameSource()" << std::endl;          return -1;      }      // 获取Body Frame Reader      IBodyFrameReader* pBodyReader = nullptr;      hResult = pBodySource->OpenReader(&pBodyReader);      if (FAILED(hResult))      {          std::cerr << "Error : IBodyFrameSource::OpenReader()" << std::endl;          return -1;      }      // 获取Coordinate Mapper      ICoordinateMapper* pCoordinateMapper = nullptr;      hResult = pSensor->get_CoordinateMapper(&pCoordinateMapper);      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::get_CoordinateMapper()" << std::endl;          return -1;      }      // 获取Color Frame Source      IColorFrameSource* pColorSource = nullptr;      hResult = pSensor->get_ColorFrameSource(&pColorSource);      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::get_ColorFrameSource()" << std::endl;          return -1;      }      // 获取Color Frame Reader      IColorFrameReader* pColorReader = nullptr;      hResult = pColorSource->OpenReader(&pColorReader);      if (FAILED(hResult))      {          std::cerr << "Error : IColorFrameSource::OpenReader()" << std::endl;          return -1;      }      // 获取最新的Color Frame      IColorFrame* pColorFrame = nullptr;      while (1)      {          hResult = pColorReader->AcquireLatestFrame(&pColorFrame);          if (SUCCEEDED(hResult))          {              // 处理Color Frame数据              break;          }          // 如果获取失败,重新获取          SafeRelease(pColorFrame);      }      // 获取最新的Body Frame      IBodyFrame* pBodyFrame = nullptr;      while (1)      {          hResult = pBodyReader->AcquireLatestFrame(&pBodyFrame);          if (SUCCEEDED(hResult))          {              // 处理Body Frame数据              break;          }          // 如果获取失败,重新获取          SafeRelease(pBodyFrame);      }      // 显示Color图像      cv::Mat colorMat(1080, 1920, CV_8UC4);      cv::Mat bodyMat(540, 960, CV_8UC4);      cv::namedWindow("Body");      // 绘制关节点和手部状态      for (int i = 0; i < BODY_COUNT; i++)      {          if (pBody[i]->get_IsTracked())          {              for (int j = 0; j < JOINT_COUNT; j++)              {                  Joint joint = pBody[i]->GetJoints(JOINT_COUNT, j);                  if (SUCCEEDED(hResult))                  {                      ColorSpacePoint point = pCoordinateMapper->MapCameraPointToColorSpace(joint.Position);                      if (point.X >= 0 && point.X < 1920 && point.Y >= 0 && point.Y < 1080)                      {                          cv::circle(colorMat, cv::Point(point.X, point.Y), 5, color[i], -1, CV_AA);                      }                  }              }          }      }      cv::imshow("Body", colorMat);      if (cv::waitKey(10) == CV_KEY_ESCAPE)      {          return 0;      }      return 0;  }

    4. cpp源文件文件

    以下是用于处理Color、Depth和BodyIndex数据的cpp源文件示例:

    // 安全释放函数  template  <  class interface  >  inline void SafeRelease(interface* &pInterfaceToRelease)  {      if (pInterfaceToRelease != nullptr)      {          pInterfaceToRelease->Release();          pInterfaceToRelease = nullptr;      }  }  // OnInitDialog函数中使用Test_kinect函数  void OnInitDialog()  {      // 调用Test_kinect函数      Test_kinect2();  }  // Test_kinect函数  int Test_kinect2()  {      // 获取Sensor接口      IKinectSensor* pSensor = nullptr;      HRESULT hResult = S_OK;      hResult = GetDefaultKinectSensor(&pSensor);      if (FAILED(hResult))      {          std::cerr << "Error : GetDefaultKinectSensor" << std::endl;          return -1;      }      hResult = pSensor->Open();      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::Open()" << std::endl;          return -1;      }      // 获取Body Frame Source      IBodyFrameSource* pBodySource = nullptr;      hResult = pSensor->get_BodyFrameSource(&pBodySource);      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::get_BodyFrameSource()" << std::endl;          return -1;      }      // 获取Body Frame Reader      IBodyFrameReader* pBodyReader = nullptr;      hResult = pBodySource->OpenReader(&pBodyReader);      if (FAILED(hResult))      {          std::cerr << "Error : IBodyFrameSource::OpenReader()" << std::endl;          return -1;      }      // 获取Coordinate Mapper      ICoordinateMapper* pCoordinateMapper = nullptr;      hResult = pSensor->get_CoordinateMapper(&pCoordinateMapper);      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::get_CoordinateMapper()" << std::endl;          return -1;      }      // 获取Color Frame Source      IColorFrameSource* pColorSource = nullptr;      hResult = pSensor->get_ColorFrameSource(&pColorSource);      if (FAILED(hResult))      {          std::cerr << "Error : IKinectSensor::get_ColorFrameSource()" << std::endl;          return -1;      }      // 获取Color Frame Reader      IColorFrameReader* pColorReader = nullptr;      hResult = pColorSource->OpenReader(&pColorReader);      if (FAILED(hResult))      {          std::cerr << "Error : IColorFrameSource::OpenReader()" << std::endl;          return -1;      }      // 获取最新的Color Frame      IColorFrame* pColorFrame = nullptr;      while (1)      {          hResult = pColorReader->AcquireLatestFrame(&pColorFrame);          if (SUCCEEDED(hResult))          {              // 处理Color Frame数据              break;          }          // 如果获取失败,重新获取          SafeRelease(pColorFrame);      }      // 获取最新的Body Frame      IBodyFrame* pBodyFrame = nullptr;      while (1)      {          hResult = pBodyReader->AcquireLatestFrame(&pBodyFrame);          if (SUCCEEDED(hResult))          {              // 处理Body Frame数据              break;          }          // 如果获取失败,重新获取          SafeRelease(pBodyFrame);      }      // 显示Color图像      cv::Mat colorMat(1080, 1920, CV_8UC4);      cv::Mat bodyMat(540, 960, CV_8UC4);      cv::namedWindow("Body");      // 绘制关节点和手部状态      for (int i = 0; i < BODY_COUNT; i++)      {          if (pBody[i]->get_IsTracked())          {              for (int j = 0; j < JOINT_COUNT; j++)              {                  Joint joint = pBody[i]->GetJoints(JOINT_COUNT, j);                  if (SUCCEEDED(hResult))                  {                      ColorSpacePoint point = pCoordinateMapper->MapCameraPointToColorSpace(joint.Position);                      if (point.X >= 0 && point.X < 1920 && point.Y >= 0 && point.Y < 1080)                      {                          cv::circle(colorMat, cv::Point(point.X, point.Y), 5, color[i], -1, CV_AA);                      }                  }              }          }      }      cv::imshow("Body", colorMat);      if (cv::waitKey(10) == CV_KEY_ESCAPE)      {          return 0;      }      return 0;  }

    5. 运行效果

    通过上述代码,可以实现以下功能:

    • 识别和显示手部张开、握拳、套索等状态。
    • 将Body数据与Color图像坐标进行匹配,实现可视化显示。
    • 实现实时的Body和Color数据获取与处理。

    转载地址:http://uhiq.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现域名转IP(附完整源码)
    查看>>
    Objective-C实现基于 LIFO的堆栈算法(附完整源码)
    查看>>
    Objective-C实现基于 LinkedList 的添加两个数字的解决方案算法(附完整源码)
    查看>>
    Objective-C实现基于事件对象实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于文件流拷贝文件(附完整源码)
    查看>>
    Objective-C实现多组输入(附完整源码)
    查看>>
    Objective-C实现字符串manacher马拉车算法(附完整源码)
    查看>>
    Objective-C实现字符串wildcard pattern matching通配符模式匹配算法(附完整源码)
    查看>>
    Objective-C实现字符串word patterns单词模式算法(附完整源码)
    查看>>
    Objective-C实现将彩色图像转换为负片算法(附完整源码)
    查看>>
    Objective-C实现将给定的 utf-8 字符串编码为 base-16算法(附完整源码)
    查看>>
    Objective-C实现数除以二divideByTwo算法(附完整源码)
    查看>>
    Objective-C实现文件的删除、复制与重命名操作实例(附完整源码)
    查看>>
    Objective-C实现是否为 Pythagoreantriplet 毕氏三元数组算法(附完整源码)
    查看>>
    Objective-C实现显示响应算法(附完整源码)
    查看>>
    Objective-C实现最小二乘多项式曲线拟合(附完整源码)
    查看>>
    Objective-C实现最快的归并排序算法(附完整源码)
    查看>>
    Objective-C实现最长公共子序列算法(附完整源码)
    查看>>
    Objective-C实现最长子数组算法(附完整源码)
    查看>>
    Objective-C实现最长字符串链(附完整源码)
    查看>>