// YeNite2SimpleUsingOpenCV.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>// OpenCV 头文件
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>#include <OpenNI.h>
#include <NiTE.h>using namespace std;
using namespace openni;
using namespace nite;int main( int argc, char **argv )
{// 初始化OpenNI
    OpenNI::initialize();// 打开Kinect设备
    Device  mDevice;mDevice.open( ANY_DEVICE );// 创建深度数据流
    VideoStream mDepthStream;mDepthStream.create( mDevice, SENSOR_DEPTH );// 设置VideoMode模式
    VideoMode mDepthMode;mDepthMode.setResolution( 640, 480 );mDepthMode.setFps( 30 );mDepthMode.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM );mDepthStream.setVideoMode(mDepthMode);// 同样的设置彩色数据流
    VideoStream mColorStream;mColorStream.create( mDevice, SENSOR_COLOR );// 设置VideoMode模式
    VideoMode mColorMode;mColorMode.setResolution( 640, 480 );mColorMode.setFps( 30 );mColorMode.setPixelFormat( PIXEL_FORMAT_RGB888 );mColorStream.setVideoMode( mColorMode);// 设置深度图像映射到彩色图像
    mDevice.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );// 为了得到骨骼数据,先初始化NiTE
    NiTE::initialize();// 创建用户跟踪器
    UserTracker mUserTracker;mUserTracker.create( &mDevice );// Control the smoothing factor of the skeleton joints. Factor should be between 0 (no smoothing at all) and 1 (no movement at all)mUserTracker.setSkeletonSmoothingFactor( 0.1f );// 创建User彩色图像显示cv::namedWindow( "User Image",  CV_WINDOW_AUTOSIZE );// 环境初始化后,开始获取深度数据流和彩色数据流
    mDepthStream.start();mColorStream.start();while( true ){// 创建OpenCV::Mat,用于显示彩色数据图像
        cv::Mat cImageBGR;// 读取彩色图像数据帧信息流
        VideoFrameRef mColorFrame;mColorStream.readFrame( &mColorFrame );// 将彩色数据流转换为OpenCV格式,记得格式是:CV_8UC3(含R\G\B)const cv::Mat mImageRGB( mColorFrame.getHeight(), mColorFrame.getWidth(),CV_8UC3, (void*)mColorFrame.getData() );// RGB ==> BGR
        cv::cvtColor( mImageRGB, cImageBGR, CV_RGB2BGR );// 读取User用户数据帧信息流
        UserTrackerFrameRef  mUserFrame;mUserTracker.readFrame( &mUserFrame );// 得到Users信息const nite::Array<UserData>& aUsers = mUserFrame.getUsers();for( int i = 0; i < aUsers.getSize(); ++ i ){const UserData& rUser = aUsers[i];// 检查用户状态if( rUser.isNew() ){// 开始对该用户的骨骼跟踪
                mUserTracker.startSkeletonTracking( rUser.getId() );}if( rUser.isVisible() ){// 得到用户骨骼数据const Skeleton& rSkeleton = rUser.getSkeleton();// 检查骨骼状态是否为“跟踪状态”if( rSkeleton.getState() == SKELETON_TRACKED ){// 得到15个骨骼数据                    SkeletonJoint aJoints[15];aJoints[ 0] = rSkeleton.getJoint( JOINT_HEAD );aJoints[ 1] = rSkeleton.getJoint( JOINT_NECK );aJoints[ 2] = rSkeleton.getJoint( JOINT_LEFT_SHOULDER );aJoints[ 3] = rSkeleton.getJoint( JOINT_RIGHT_SHOULDER );aJoints[ 4] = rSkeleton.getJoint( JOINT_LEFT_ELBOW );aJoints[ 5] = rSkeleton.getJoint( JOINT_RIGHT_ELBOW );aJoints[ 6] = rSkeleton.getJoint( JOINT_LEFT_HAND );aJoints[ 7] = rSkeleton.getJoint( JOINT_RIGHT_HAND );aJoints[ 8] = rSkeleton.getJoint( JOINT_TORSO );aJoints[ 9] = rSkeleton.getJoint( JOINT_LEFT_HIP );aJoints[10] = rSkeleton.getJoint( JOINT_RIGHT_HIP );aJoints[11] = rSkeleton.getJoint( JOINT_LEFT_KNEE );aJoints[12] = rSkeleton.getJoint( JOINT_RIGHT_KNEE );aJoints[13] = rSkeleton.getJoint( JOINT_LEFT_FOOT );aJoints[14] = rSkeleton.getJoint( JOINT_RIGHT_FOOT );// 将骨骼3D坐标转换为深度坐标下骨骼位置坐标,并保存在数组中cv::Point2f aPoint[15];for( int  s = 0; s < 15; ++ s ){const Point3f& rPos = aJoints[s].getPosition();mUserTracker.convertJointCoordinatesToDepth( rPos.x, rPos.y, rPos.z,&(aPoint[s].x), &(aPoint[s].y) );}// 在彩色图像中画出骨骼间的连接线cv::line( cImageBGR, aPoint[ 0], aPoint[ 1], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 1], aPoint[ 2], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 1], aPoint[ 3], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 2], aPoint[ 4], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 3], aPoint[ 5], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 4], aPoint[ 6], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 5], aPoint[ 7], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 1], aPoint[ 8], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 8], aPoint[ 9], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 8], aPoint[10], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[ 9], aPoint[11], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[10], aPoint[12], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[11], aPoint[13], cv::Scalar( 255, 0, 0 ), 3 );cv::line( cImageBGR, aPoint[12], aPoint[14], cv::Scalar( 255, 0, 0 ), 3 );// 同样的在彩色图像中骨骼位置上画“圆”for( int  s = 0; s < 15; ++ s ){if( aJoints[s].getPositionConfidence() > 0.5 )cv::circle( cImageBGR, aPoint[s], 3, cv::Scalar( 0, 0, 255 ), 2 );elsecv::circle( cImageBGR, aPoint[s], 3, cv::Scalar( 0, 255, 0 ), 2 );}}}}// 显示图像cv::imshow( "User Image", cImageBGR );// 按键“q”退出循环if( cv::waitKey( 1 ) == 'q' )break;}// 先销毁User跟踪器
    mUserTracker.destroy();// 销毁彩色数据流和深度数据流
    mColorStream.destroy();mDepthStream.destroy();// 关闭Kinect设备
    mDevice.close();// 关闭NITE和OpenNI环境
    NiTE::shutdown();OpenNI::shutdown();return 0;
}

效果图:

人体骨骼坐标在彩色图像中显示相关推荐

  1. 谈谈NITE 2与OpenCV结合的第二个程序(提取人体骨骼坐标)

    温故而知新--NITE 2的基本使用主要包括以下几个步骤: 1. 初始化NITE环境: nite::NiTE::initialize(); 2. 创建User跟踪器: nite::UserTracke ...

  2. Kinect+OpenNI学习笔记之6(获取人体骨架并在Qt中显示)

    前言 MS的kinec SDK和OpenNI都提供了人体骨骼跟踪的算法,人体骨骼跟踪算法在kinect人体行为识别中非常重要,该识别过程通常被用来作为行为识别的第一步, 比如说,通过定位人体中的骨骼支 ...

  3. 地图定位的坐标和mapview中显示的当前位置信息不一致

    2019独角兽企业重金招聘Python工程师标准>>> // 准确打开方式 - (void)mapView:(MKMapView *)mapView didUpdateUserLoc ...

  4. Kinect Azure DK获取深度图、深度数据和人体骨骼关键点三维坐标

    使用环境:Azure Kinect SDK v1.4.1 + Azure Kinect Body Tracking SDK 1.0.1 + VS2019 + Opencv 文章目录 一.获取深度图 二 ...

  5. python截取图片的ROI+OpenCV 在坐标中显示图片+鼠标点击图片显示点坐标

    又来做下笔记了.现在我的毕业设计进行到数据处理的阶段,要在乳腺图像上截取4张相同大小的1024*1024图片,并且每张图片都必须覆盖微钙化点,以下是我现在用到的一些简单程序. 1.首先是截图程序如下: ...

  6. [matlab数字图像处理8]提取一副彩色图像中红色,用HIS模型处理,RGB模型对比显示

    一. 问题描述 提取一副彩色图像中红色,用HIS模型处理,RGB模型对比显示: 二. 求解思路 彩色图像的处理有两种主要方法,RBG(红,绿,蓝)和HIS(色调,饱和度,亮度),matlab可以直接读 ...

  7. opencv-python数字图像处理学习7:提取一副彩色图像中红色,用HIS模型处理,RGB模型对比显示

    提取一副彩色图像中红色,用HIS模型处理,RGB模型对比显示 参考文献 引入 显示HIS模型提取的红色 RGB模型 提取红色 参考文献 bgr_2_hsi.color_slicing来自:数字图像处理 ...

  8. 十、获取人体骨骼关键点三维坐标——Azure Kinect DK入门

    Azure Kinect DK 文档 Azure-Kinect-Sensor-SDK 文档 Azure Kinect Body Tracking SDK 文档 OpenCV文档 参考文档学习,边学,边 ...

  9. html 地址坐标图标,浏览器地址栏中显示自定义小图标

    什么是favicon? 所谓favicon,即Favorites Icon的缩写,顾名思义,便是其可以让浏览器的收藏夹中除显示相应的标题外,还以图标的方式区别不同的网站.当然,这不仅仅是Favicon ...

最新文章

  1. React学习笔记5:React Hooks概述
  2. 阿里技术人的成长路径是什么?
  3. 转:Ubuntu中安装和配置 Java JDK,并卸载自带OpenJDK(以Ubuntu 14.04为例)
  4. 各种语言下 static 详解
  5. 同一服务器 数据库间 不同表 的查询
  6. 蓝桥杯_算法训练_表达式计算
  7. el表达式动态取值中括号内两点_中考热点:旧瓶新酒,解题新策略分析之玩转动态型热点题型...
  8. Apache与Nginx实现Web页面动静分离(产生的原因,应用场景)
  9. 如何从ERP下载Sales BOM到CRM
  10. 使用vue-cli脚手架搭建简单项目框架
  11. 培训工资我看大学培训机构--大学生到底要不要参加培训机构 一个参加培训的大学生的真实感受...
  12. robotframework 新建UI自动化测试用例实例一(2)
  13. 计算机vb基础知识试题及答案,2014年计算机二级VB试题及答案
  14. antdesignVue递归导航菜单
  15. 【目标检测】57、Dual Weighting Label Assignment | 专为目标检测设计的双权重标签分配
  16. openCV和python基于dlib库实现眨眼/睁闭眼检测--亲测高效
  17. 攻防世界的杂项高手题之神奇的Modbus
  18. centos 7搭建直播间
  19. MC34063芯片应用
  20. 数据库 MySQL-window安装和卸载

热门文章

  1. swit 闭包的基本使用
  2. c语言empty函数返回结果,c++中函数empty()怎么使用
  3. 计算机导论-3-计算机组成部分
  4. 回溯法求解连续邮资问题
  5. 吐血整理!某平台2980元OpenCV、图像识别等资料限时下载,仅此1天
  6. [思维模式-8]:《如何系统思考》-4- 认识篇 - 什么是系统思考?系统思考的特征?系统思考的思维转变。
  7. 苹果正在开发更便宜的耳机
  8. android天天爱消除游戏挂机脚本的实现思路
  9. 河南移动联合中兴打造SPNPTN网络融合示范样板
  10. java图形界面外部类例题_[JAVA_开课吧资源]第四周 图形用户界面程序设计