kinect v2获取人体骨骼数据

这篇具有很好参考价值的文章主要介绍了kinect v2获取人体骨骼数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <iostream>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")
#include <chrono>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>        // 核心功能,包括矩阵和数组操作
#include <opencv2/imgproc.hpp>     // 图像处理功能
#include <opencv2/highgui.hpp>     // 图形用户界面相关功能,用于显示图像和交互
#include <opencv2/video.hpp>       // 视频处理功能
#include <Kinect.h>
#include <fstream>
#include<chrono>
#include<thread>

using namespace cv;


void DrawLine(cv::Mat& Img, const Joint& r1, const Joint& r2, ICoordinateMapper* pMapper)
{
	if (r1.TrackingState == TrackingState_Tracked && r2.TrackingState == TrackingState_Tracked)
	{
		ColorSpacePoint p1, p2;
		pMapper->MapCameraPointToColorSpace(r1.Position, &p1);
		pMapper->MapCameraPointToColorSpace(r2.Position, &p2);
		line(Img, Point(p1.X, p1.Y), Point(p2.X, p2.Y), Vec3b(0, 0, 255), 5);
		circle(Img, Point(p1.X, p1.Y), 10, (0, 0, 255), -1);
		circle(Img, Point(p2.X, p2.Y), 10, (0, 0, 255), -1);
	}
}


int main()
{
	
	IKinectSensor* pSensor = nullptr;
	GetDefaultKinectSensor(&pSensor); 
	pSensor->Open(); 
	IColorFrameSource* pFrameSource = nullptr;
	pSensor->get_ColorFrameSource(&pFrameSource);
	int iWidth = 0, iHeight = 0;
	IFrameDescription* pFrameDescription = nullptr;
	pFrameSource->get_FrameDescription(&pFrameDescription);
	pFrameDescription->get_Width(&iWidth);
	pFrameDescription->get_Height(&iHeight);

	IColorFrameReader* pColorFrameReader = nullptr;
	pFrameSource->OpenReader(&pColorFrameReader);

	pFrameDescription->Release();
	pFrameDescription = nullptr;

	pFrameSource->Release();
	pFrameSource = nullptr;
	
	UINT uBufferSize = 0;
	cv::Mat mColorImg(iHeight, iWidth, CV_8UC4);
	uBufferSize = iHeight * iWidth * 4 * sizeof(BYTE);

	IBodyFrameReader* pBodyFrameReader = nullptr;
	IBody** aBodyData = nullptr;
	INT32 iBodyCount = 0;

	IBodyFrameSource* pBodySource = nullptr;
	pSensor->get_BodyFrameSource(&pBodySource);
	pBodySource->get_BodyCount(&iBodyCount);

	aBodyData = new IBody*[iBodyCount];
	for (int i = 0; i < iBodyCount; ++i)
		aBodyData[i] = nullptr;		
	pBodySource->OpenReader(&pBodyFrameReader);
	pBodySource->Release();
	pBodySource = nullptr;

	
	ICoordinateMapper* pCoordinateMapper = nullptr;
	pSensor->get_CoordinateMapper(&pCoordinateMapper);
	cv::namedWindow("Body Image", cv::WINDOW_NORMAL);
	cv::resizeWindow("Body Image", 560, 360);	
	while (true)
	{

		IColorFrame* pColorFrame = nullptr;
		if (pColorFrameReader->AcquireLatestFrame(&pColorFrame) == S_OK)
		{

			pColorFrame->CopyConvertedFrameDataToArray(uBufferSize, mColorImg.data, ColorImageFormat_Bgra);
			pColorFrame->Release();
		}
		
		cv::Mat mImg = mColorImg.clone();
		IBodyFrame* pBodyFrame = nullptr;
		
		if (pBodyFrameReader->AcquireLatestFrame(&pBodyFrame) == S_OK)
		{
			// std::cout << "读取人体帧数据成功" << std::endl;
			
			if (pBodyFrame->GetAndRefreshBodyData(iBodyCount, aBodyData) == S_OK)
			{
				// std::cout << "获取骨骼帧中的骨骼数据成功" << std::endl;

				for (int i = 0; i < iBodyCount; ++i)
				{
					IBody* pBody = aBodyData[i];
					BOOLEAN bTracked = false;
					if ((pBody->get_IsTracked(&bTracked) == S_OK) && bTracked)
					{
						// std::cout << "骨骼已被跟踪" << std::endl;
						// std::cout << "跟踪序号:" << i << std::endl;
						Joint aJoints[JointType_Count];
						if (pBody->GetJoints(JointType_Count, aJoints) == S_OK)
						{
							//脊柱
							DrawLine(mImg, aJoints[JointType_SpineBase], aJoints[JointType_SpineMid], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_SpineMid], aJoints[JointType_SpineShoulder], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_SpineShoulder], aJoints[JointType_Neck], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_Neck], aJoints[JointType_Head], pCoordinateMapper);
							//左 arm
							DrawLine(mImg, aJoints[JointType_SpineShoulder], aJoints[JointType_ShoulderLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_ShoulderLeft], aJoints[JointType_ElbowLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_ElbowLeft], aJoints[JointType_WristLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_WristLeft], aJoints[JointType_HandLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_HandLeft], aJoints[JointType_HandTipLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_WristLeft], aJoints[JointType_ThumbLeft], pCoordinateMapper);
							//右arm
							DrawLine(mImg, aJoints[JointType_SpineShoulder], aJoints[JointType_ShoulderRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_ShoulderRight], aJoints[JointType_ElbowRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_ElbowRight], aJoints[JointType_WristRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_WristRight], aJoints[JointType_HandRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_HandRight], aJoints[JointType_HandTipRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_WristRight], aJoints[JointType_ThumbRight], pCoordinateMapper);
							//左leg
							DrawLine(mImg, aJoints[JointType_SpineBase], aJoints[JointType_HipLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_HipLeft], aJoints[JointType_KneeLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_KneeLeft], aJoints[JointType_AnkleLeft], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_AnkleLeft], aJoints[JointType_FootLeft], pCoordinateMapper);
							//右leg
							DrawLine(mImg, aJoints[JointType_SpineBase], aJoints[JointType_HipRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_HipRight], aJoints[JointType_KneeRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_KneeRight], aJoints[JointType_AnkleRight], pCoordinateMapper);
							DrawLine(mImg, aJoints[JointType_AnkleRight], aJoints[JointType_FootRight], pCoordinateMapper);

							// *************************保存TXT数据*************************
							//创建一个名为"data.txt"的文本文件,并清空其中的内容
							std::ofstream outfile("data_test139.txt", std::ios::trunc);
							for (int s = 0; s < JointType_Count; s++)
							{
								outfile << aJoints[s].Position.X << "\t" << aJoints[s].Position.Y << "\t" << aJoints[s].Position.Z << std::endl;
							}
							outfile << std::endl;
							std::cout << "骨骼关节点数据写入成功" << std::endl;
						}
					}
					//追踪失败
					else {
						if (pBody->get_IsTracked(&bTracked) != S_OK) {
							std::cerr << "骨骼追踪失败,Failed to read body tracking state. Error code: " << pBody->get_IsTracked(&bTracked) << std::endl;
						}
						//未被追踪
						else if (!bTracked)
						{
							std::cerr << "骨骼未被追踪,Body is not being tracked." << std::endl;
						}
					}
				}
			}
			else
			{
				std::cerr << "Can't read body data" << std::endl;
			}
			pBodyFrame->Release();
		}
		cv::imshow("Body Image", mImg);
		if (cv::waitKey(5) == VK_ESCAPE)
		{
			break;
		}
	}
	pSensor->Close();
	pSensor->Release();
	pSensor = nullptr;

	return 0;
}

文章来源地址https://www.toymoban.com/news/detail-715889.html

到了这里,关于kinect v2获取人体骨骼数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 点云从入门到精通技术详解100篇-基于 Kinect v2 相机的柑橘点云分割与配准

    目录 前言 国内外研究现状 重叠果实分割国内外研究现状 点云配准国内外研究现状

    2024年02月08日
    浏览(38)
  • Azure Kinect获取相机内参

    在采集点云数据时需要根据相机不同depth、color分辨率调整对应相机内参u0(px)、v0(py)、fx、fy,那么具体内参怎么获得呢?就跟随ludaner一起来看看吧。 其实Azure-Kinect-Sensor-SDK已经提供了example代码,只需编译运行即可: Azure-Kinect-Sensor-SDK/main.cpp at develop · microsoft/Azure-Kinect-Sensor-S

    2023年04月13日
    浏览(75)
  • 【Unity】GPU骨骼动画 GPU Spine动画 2D/3D渲染性能开挂 动画合批 支持武器挂载 支持实时获取骨骼位置

     GPU 3D骨骼动画和 GPU 2D Spine动画插件均包含在【万人同屏整合方案】中,老板们可在某宝搜:[游戏开发资源商店] 以获取全套方案的所有源码插件。 插件功能: 1. 支持3D动画转GPU动画  2. 支持2D Spine动画转GPU动画 3. 支持挂点、支持挂载物、动态切换挂载物、实时获取挂点T

    2024年01月18日
    浏览(44)
  • 【Unity】GPU骨骼 GPU Spine动画 2D/3D渲染性能开挂 合批渲染 支持武器挂载 动画事件 动画融合 实时获取骨骼位置

     GPU 3D骨骼动画和 GPU 2D Spine动画插件均包含在【万人同屏整合方案】中,老板们可在某宝搜:[游戏开发资源商店] 以获取全套方案的所有源码插件。   万人同屏渲染避障锁敌方案实现对抗战斗demo 展示GPU动画高级功能 动画事件 动画平滑过渡 融合   插件功能: 1. 支持3D动画

    2024年02月22日
    浏览(48)
  • 利用openpose提取自建数据集骨骼点训练st-gcn,复现st-gcn

    参考: gitbub上fork后导入到gitee快些: st-gcn下载 也可以直接下载zip文件后解压 数据集要求将相同类别的视频放到同一文件夹,我这里用到一个较老的数据集:training_lib_KTH.zip,六种行为放到六个不同文件夹。 用于st-gcn训练的数据集视频帧数不要超过300帧,5~6s的视频时长比较好,

    2024年01月17日
    浏览(25)
  • 【Kinect】Ubuntu20.04 安装Azure Kinect Sensor

    本文主要记录Ubuntu20.04 安装Azure Kinect Sensor SDK Azure Kinect 人体跟踪 SDK官网 : https://learn.microsoft.com/zh-cn/azure/Kinect-dk/body-sdk-download Linux版本目前只支持 18.04 和 20.04 Azure Kinect 传感器 SDK 官网: https://learn.microsoft.com/zh-cn/azure/Kinect-dk/sensor-sdk-download Linux版本目前只支持 18.04 ,但也能

    2024年02月06日
    浏览(40)
  • 【开源技术分享】Java读写操作Mp3的库:MP3AGIC,使用MP3AGIC获取ID3v1值和获取ID3v2专辑封面和修改ID3v2封面图片等mp3信息

    mp3agic是一个纯Java库。用于读取mp3文件和读取/操作ID3标签(ID3v1和ID3v2.2到ID3v2.4),可以使用 ID3 标签中的详细信息重命名 mp3 文件、重新标记 mp3 文件、将图像附加到 mp3 文件以及从 mp3 文件中提取图像等等任务。 除此以外,JavaCV也可以支持mp3封面读取:《JavaCV音视频开发宝典

    2024年02月16日
    浏览(46)
  • 【Azure Developer】Azure AD 注册应用的 OAuth 2.0 v2 终结点获取的 Token 解析出来依旧为v1, 这是什么情况!

    使用 Azure AD 注册应用 Oauth2 v2.0的终结点(OAuth 2.0 token endpoint (v2): https://login.partner.microsoftonline.cn/your tenant id/oauth2/v2.0/token ) 获取Token,解析出来依旧为v1.0,如何解决呢? 请求Method: POST 请求URL :  https://login.partner.microsoftonline.cn/your tenant id/oauth2/v2.0/token 请求的Body : tenant:

    2024年02月02日
    浏览(46)
  • Windows配置Kinect环境

    可以到官网上下载: cloudcompare下载网址:https://www.cloudcompare.org/ Azure Kinect SDK下载网址:https://learn.microsoft.com/zh-cn/azure/Kinect-dk/sensor-sdk-download 但是下载速度会比较慢,可以网盘下载: 链接:https://pan.baidu.com/s/1usSVl-tpegcmd5luJyOpaA?pwd=qwer 提取码:qwer 按照我的安装经验,SDK的.ex

    2024年02月05日
    浏览(97)
  • Azure Kinect 使用记录 (一)

    20211111 - 占坑 20211115 - 添加vs编译内容 20220311 - k4abt_simple_3d_viewer 突然用不了了 因项目需要,得用Azure Kinect以及它的SDK进行开发,在这里记录下心得体会,不定时更新 1.0 k4abt_simple_3d_viewer 闪退 之前用着还好好的,突然就用不了了,表现情况是,双击 k4abt_simple_3d_viewer.exe ,出现

    2024年02月06日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包