首先看骨骼追踪例子代码的结构:

aaarticlea/png;base64,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" alt="" />

例子代码不是很多,在SkeletonBasics.cpp中,大部分的功能都在kinect SDK中实现,应用开发只需要了解接口,并调用它的接口即可。首先我们找到main函数:

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
CSkeletonBasics application;
application.Run(hInstance, nCmdShow);
}

这个main函数是不是似曾相识,跟深度图的main函数差不多的,只是构造一个对象,然后调用这个对象的Run接口,构造函数只是初始化成员,所以我们直接看Run的实现:

int CSkeletonBasics::Run(HINSTANCE hInstance, int nCmdShow)
{
MSG msg = {0};
WNDCLASS wc = {0}; // Dialog custom window class
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInstance;
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
wc.hIcon = LoadIconW(hInstance, MAKEINTRESOURCE(IDI_APP));
wc.lpfnWndProc = DefDlgProcW;
wc.lpszClassName = L"SkeletonBasicsAppDlgWndClass"; if (!RegisterClassW(&wc))
{
return 0;
} // Create main application window
HWND hWndApp = CreateDialogParamW(
hInstance,
MAKEINTRESOURCE(IDD_APP),
NULL,
(DLGPROC)CSkeletonBasics::MessageRouter,
reinterpret_cast<LPARAM>(this)); // Show window
ShowWindow(hWndApp, nCmdShow); const int eventCount = 1;
HANDLE hEvents[eventCount]; // Main message loop
while (WM_QUIT != msg.message)
{
hEvents[0] = m_hNextSkeletonEvent; // Check to see if we have either a message (by passing in QS_ALLEVENTS)
// Or a Kinect event (hEvents)
// Update() will check for Kinect events individually, in case more than one are signalled
DWORD dwEvent = MsgWaitForMultipleObjects(eventCount, hEvents, FALSE, INFINITE, QS_ALLINPUT); // Check if this is an event we're waiting on and not a timeout or message
if (WAIT_OBJECT_0 == dwEvent)
{
Update();
} if (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
{
// If a dialog message will be taken care of by the dialog proc
if ((hWndApp != NULL) && IsDialogMessageW(hWndApp, &msg))
{
continue;
} TranslateMessage(&msg);
DispatchMessageW(&msg);
}
} return static_cast<int>(msg.wParam);
}

这个Run函数是不是也是很熟悉,跟深度图的Run函数也是差不多,创建对话框,然后进入消息处理死循环,在死循环里处理窗口消息和kinect消息。

接下来和深度图一样,我们也进入到窗口初始化消息里,看整个程序的初始化是怎么样的:

LRESULT CALLBACK CSkeletonBasics::DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// Bind application window handle
m_hWnd = hWnd; // Init Direct2D
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory); // Look for a connected Kinect, and create it if found
CreateFirstConnected();
}
break;

初始化处理和深度图也差不多,D2D1CreateFactory函数创建DirectX对象,然后调用CreateFirstConnected去创建kinect对象,在CreateFirstConnected函数里的处理又有何不同呢?我们一起来看代码:

HRESULT CSkeletonBasics::CreateFirstConnected()
{
INuiSensor * pNuiSensor; // 获取kinect数量
int iSensorCount = 0;
HRESULT hr = NuiGetSensorCount(&iSensorCount);
if (FAILED(hr))
{
return hr;
} // Look at each Kinect sensor 查找一个有效的kinect设备
for (int i = 0; i < iSensorCount; ++i)
{
// Create the sensor so we can check status, if we can't create it, move on to the next
hr = NuiCreateSensorByIndex(i, &pNuiSensor);
if (FAILED(hr))
{
continue;
} // Get the status of the sensor, and if connected, then we can initialize it
hr = pNuiSensor->NuiStatus();
if (S_OK == hr)
{
m_pNuiSensor = pNuiSensor;
break;
} // This sensor wasn't OK, so release it since we're not using it
pNuiSensor->Release();
} if (NULL != m_pNuiSensor)
{
// 这里的参数和深度图不一样,深度图用的参数是NUI_INITIALIZE_FLAG_USES_DEPTH
// 这个意思就是将这个kinect初始化成骨骼跟踪
hr = m_pNuiSensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);
if (SUCCEEDED(hr))
{
// 这个Event和深度图一样,是kinectSDK和上层应用程序通信的事件
m_hNextSkeletonEvent = CreateEventW(NULL, TRUE, FALSE, NULL); // 打开一个骨骼跟踪数据,深度图需要的参数比较复杂,这个比较简答
hr = m_pNuiSensor->NuiSkeletonTrackingEnable(m_hNextSkeletonEvent, 0);
}
} if (NULL == m_pNuiSensor || FAILED(hr))
{
SetStatusMessage(L"No ready Kinect found!");
return E_FAIL;
} return hr;
}

看初始化kinect设备的代码,貌似区别也不是很大,只是初始化参数不同,打开数据流的函数不同,框架性的代码还是差不多的。

当这个m_hNextSkeletonEvent事件被注册到kinect SDK库之后,当有数据来时,Update函数会被调用,Update函数最后调用了ProcessSkeleton函数来处理骨骼数据:

void CSkeletonBasics::ProcessSkeleton()
{
NUI_SKELETON_FRAME skeletonFrame = {0}; // 获取一帧骨骼数据
HRESULT hr = m_pNuiSensor->NuiSkeletonGetNextFrame(0, &skeletonFrame);
if ( FAILED(hr) )
{
return;
} // 让骨骼数据变得平滑,消除抖动现象
m_pNuiSensor->NuiTransformSmooth(&skeletonFrame, NULL); // 创建m_pRenderTarget对象
hr = EnsureDirect2DResources( );
if ( FAILED(hr) )
{
return;
} m_pRenderTarget->BeginDraw();
m_pRenderTarget->Clear( ); RECT rct;
GetClientRect( GetDlgItem( m_hWnd, IDC_VIDEOVIEW ), &rct);
int width = rct.right;
int height = rct.bottom; // 最多支持6个人的骨骼跟踪数据
for (int i = 0 ; i < NUI_SKELETON_COUNT; ++i)
{
NUI_SKELETON_TRACKING_STATE trackingState = skeletonFrame.SkeletonData[i].eTrackingState; if (NUI_SKELETON_TRACKED == trackingState)
{
// 画骨骼
DrawSkeleton(skeletonFrame.SkeletonData[i], width, height);
}
else if (NUI_SKELETON_POSITION_ONLY == trackingState)
{
// 只是跟踪位置的话,那么就画个位置,在人很多时,kinect只跟踪两个人的骨骼,其他人之显示位置
D2D1_ELLIPSE ellipse = D2D1::Ellipse(
SkeletonToScreen(skeletonFrame.SkeletonData[i].Position, width, height),
g_JointThickness,
g_JointThickness
); m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
}
} hr = m_pRenderTarget->EndDraw(); // Device lost, need to recreate the render target
// We'll dispose it now and retry drawing
if (D2DERR_RECREATE_TARGET == hr)
{
hr = S_OK;
DiscardDirect2DResources();
}
}

在处理骨骼数据函数中,对数据skeletonFrame中保存的六个骨骼跟踪数据循环处理,如果状态是NUI_SKELETON_TRACKED则通过DrawSkeleton画详细骨骼信息,如果是NUI_SKELETON_POSITION_ONLY则只画位置信息,如果不是这两个状态,则啥也不做。接下来我们来看看DrawSkeleton看看骨骼信息怎么画的:

void CSkeletonBasics::DrawSkeleton(const NUI_SKELETON_DATA & skel, int windowWidth, int windowHeight)
{
int i; // 将关节点转化成屏幕上的坐标点
for (i = 0; i < NUI_SKELETON_POSITION_COUNT; ++i)
{
m_Points[i] = SkeletonToScreen(skel.SkeletonPositions[i], windowWidth, windowHeight);
} // 画骨骼,参数1是骨骼数据,参数2和参数3是关节
DrawBone(skel, NUI_SKELETON_POSITION_HEAD, NUI_SKELETON_POSITION_SHOULDER_CENTER); // 这个是脑袋,从脑袋关节到肩膀中间
DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SHOULDER_LEFT); // 肩膀中间到左边
DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SHOULDER_RIGHT); // 肩膀中间到右边,下面的类似
DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_CENTER, NUI_SKELETON_POSITION_SPINE);
DrawBone(skel, NUI_SKELETON_POSITION_SPINE, NUI_SKELETON_POSITION_HIP_CENTER);
DrawBone(skel, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_HIP_LEFT);
DrawBone(skel, NUI_SKELETON_POSITION_HIP_CENTER, NUI_SKELETON_POSITION_HIP_RIGHT); // Left Arm
DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_LEFT, NUI_SKELETON_POSITION_ELBOW_LEFT);
DrawBone(skel, NUI_SKELETON_POSITION_ELBOW_LEFT, NUI_SKELETON_POSITION_WRIST_LEFT);
DrawBone(skel, NUI_SKELETON_POSITION_WRIST_LEFT, NUI_SKELETON_POSITION_HAND_LEFT); // Right Arm
DrawBone(skel, NUI_SKELETON_POSITION_SHOULDER_RIGHT, NUI_SKELETON_POSITION_ELBOW_RIGHT);
DrawBone(skel, NUI_SKELETON_POSITION_ELBOW_RIGHT, NUI_SKELETON_POSITION_WRIST_RIGHT);
DrawBone(skel, NUI_SKELETON_POSITION_WRIST_RIGHT, NUI_SKELETON_POSITION_HAND_RIGHT); // Left Leg
DrawBone(skel, NUI_SKELETON_POSITION_HIP_LEFT, NUI_SKELETON_POSITION_KNEE_LEFT);
DrawBone(skel, NUI_SKELETON_POSITION_KNEE_LEFT, NUI_SKELETON_POSITION_ANKLE_LEFT);
DrawBone(skel, NUI_SKELETON_POSITION_ANKLE_LEFT, NUI_SKELETON_POSITION_FOOT_LEFT); // Right Leg
DrawBone(skel, NUI_SKELETON_POSITION_HIP_RIGHT, NUI_SKELETON_POSITION_KNEE_RIGHT);
DrawBone(skel, NUI_SKELETON_POSITION_KNEE_RIGHT, NUI_SKELETON_POSITION_ANKLE_RIGHT);
DrawBone(skel, NUI_SKELETON_POSITION_ANKLE_RIGHT, NUI_SKELETON_POSITION_FOOT_RIGHT); // 画关节
for (i = 0; i < NUI_SKELETON_POSITION_COUNT; ++i)
{
D2D1_ELLIPSE ellipse = D2D1::Ellipse( m_Points[i], g_JointThickness, g_JointThickness ); if ( skel.eSkeletonPositionTrackingState[i] == NUI_SKELETON_POSITION_INFERRED )
{
m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointInferred);
}
else if ( skel.eSkeletonPositionTrackingState[i] == NUI_SKELETON_POSITION_TRACKED )
{
m_pRenderTarget->DrawEllipse(ellipse, m_pBrushJointTracked);
}
}
}

在这里绘制比较简单,所以这里绘制并没有像深度图一样使用一个类来做绘制,直接写到函数里了。另外一个这里DirectX的绘制也就只是画画线,如果你熟悉GDI,完全可以通过GDI来绘图,而不用DirectX。

kinect for windows - SkeletonBasics-D2D详解之二的更多相关文章

  1. Windows Service 之 详解(二)

    一.创建 Windows 服务程序 1.文件 → 新建 → 项目 → 选择 Windows 服务模板,创建 WinService 项目: 选择这个服务的属性,可以打开属性对话框.可配置如下值: [1] ...

  2. windows socket函数详解

    windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...

  3. Python调用windows下DLL详解

    Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...

  4. redis.windows.conf配置详解

    redis.windows.conf配置详解 转自:https://www.cnblogs.com/kreo/p/4423362.html # redis 配置文件示例 # 当你需要为某个配置项指定内 ...

  5. 重装Windows系统 入门详解 - 基础教程

    重装Windows系统 入门详解 - 基础教程 JERRY_Z. ~ 2020 / 10 / 13 转载请注明出处!️ 目录 重装Windows系统 入门详解 - 基础教程 一.说明 二.具体步骤 ( ...

  6. windows 安装Git详解

    windows 安装Git详解 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...

  7. Tomcat--各个目录详解(二)

    Tomcat整体目录: 一.bin文件(存放启动和关闭tomcat脚本) 其中.bat和.sh文件很多都是成对出现的,作用是一样的,一个是Windows的,一个是Linux. ① startup文件: ...

  8. 「翻译」Unity中的AssetBundle详解(二)

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

  9. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  10. 【转】logback logback.xml常用配置详解(二)<appender>

    原创文章,转载请指明出处:http://aub.iteye.com/blog/1101260, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...

随机推荐

  1. 怎样在UICollectionView中添加Header和footer

    ---恢复内容开始--- 怎样在UICollectionView中添加Header和footer 转载于http://my.oschina.net/zboy/blog/221525 摘要 来自-htt ...

  2. apache hide index.php

    <Directory "D:/usr/local/www">    AllowOverride all    Options +FollowSymLinks +SymL ...

  3. 巧妙实现缺角radiogroup控制多个fragment切换和滑动

    在android开发中,用一个radiogroup控制多个fragment切换是十分常见的需求.但是如果fragment是一个ListView,如何保证滑动的时候通过缺角可以看到下面的listview ...

  4. 删除windows7保留分区

    在系统里以管理员运行CMD.exe键入diskpartsel disk 0  (select 选择硬盘)list vol  (查看卷)sel vol 0  (选择卷,0为保留分区)inactive ( ...

  5. 2015 8月之后"云计算"学习计划

    1. 自己在家搭建openstack,使用RDO搭建自己的openstack环境,不必源码方式搭建,只要搭建起来就好,越快越好 --以RDO方式,搭建一个all-in-one的主机,只需要租一台虚拟机 ...

  6. delphi如何获得当前操作系统语言环境

    function GetWindowsLanguage: string; var WinLanguage: ..] of char; begin VerLanguageName(GetSystemDe ...

  7. 一个简单的反射连接程序(修改文件时间,以及创建Windows服务)

    program SvrDemo; uses  Windows,  WinSvc,  winsock; const  RegName = 'SvrDemo'; var  szServiceName: p ...

  8. liunx 同步时间

    ntpdate stdtime.gov.hk (美国) time.nist.gov (复旦)(国内用户推荐) ntp.fudan.edu.cn 微软公司授时主机(美国) time.windows.co ...

  9. firefox的window.onerror没有详细的出错提示

    当在firefox浏览器的a.htm页面中使用script标签加载某a.js出错时,如果放置window.onerror事件处理方法时,此方法获取到的错误信息都是固定的: {0:"Scrip ...

  10. C++使用OLE高速读写EXCEL的源码

    我的代码参考的地方是这儿,再次感谢原作者 http://blog.csdn.net/gyssoft/archive/2007/04/29/1592104.aspx 我根据自己的需要做了整理,干净了一点 ...