Depth在kinect中经常被翻译为深度图,指的是图像到摄像头的距离,这些距离数据能让机器知道物理距离有多远。kinect通过两个红外摄像头来实现这个功能的。在这个例子里,就实现了深度图的提取和现实功能。

下面我们来研究下这个例子的代码,让我们对kinect for windows的开发包有个粗浅的认识。

代码结构:

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

主要的代码是DepthBasic.cpp,这个代码实现了深度图的读取

另外一个主要的代码文件时ImageRenderer,这个代码实现的是,将获取的深度图,展示在窗口上。

main函数:

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

从main函数看,main函数只调用了两个函数,一个是CDepthBasics的构造函数,另外一个是CDepthBasics的Run函数。构造函数只是初始化,我们略过,继续看Run函数。

CDepthBasics::Run函数,解释都在代码中,大家可以看注释

int CDepthBasics::Run(HINSTANCE hInstance, int nCmdShow)
{
MSG msg = {0};
WNDCLASS wc; // Dialog custom window class win32创建窗口前的准备工作,构造窗口类结构
ZeroMemory(&wc, sizeof(wc));
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"DepthBasicsAppDlgWndClass"; // 注册窗口类
if (!RegisterClassW(&wc))
{
return 0;
} // Create main application window 用该窗口类创建对话框
HWND hWndApp = CreateDialogParamW(
hInstance,
MAKEINTRESOURCE(IDD_APP),
NULL,
(DLGPROC)CDepthBasics::MessageRouter,
reinterpret_cast<LPARAM>(this)); // Show window 显示对话框
ShowWindow(hWndApp, nCmdShow); // 这个用来检测kinect消息的event
const int eventCount = 1;
HANDLE hEvents[eventCount]; // Main message loop windwos消息循环,在这个消息循环里,如果没有kinect,那就是简单的处理窗口消息即可,但是....
while (WM_QUIT != msg.message)
{
// 为什么在这里赋值,相当于每次循环都赋值?因为这个句柄随着消息处理会变化
hEvents[0] = m_hNextDepthFrameEvent; // 检查kinect事件,第一个参数1表示等待一个句柄,第二个参数是消息数组,第三个参数指示是不是要等数组里的所有消息,参数是false
// 第四个参数是等待多久,INFINITE表示永远,第五个参数呢,因为第四个参数说没有kinect消息这个函数就一直阻塞这里,那么它肯定可能影响正常的windows消息处理
// 所以第五个参数表示说有些情况下也要打断这个等待,QS_ALLINPUT就表示在有windows消息时,该函数也不再阻塞的继续往下执行
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 返回WAIT_OBJECT_0表示kinect有消息来,否则表示没消息
if (WAIT_OBJECT_0 == dwEvent)
{
// 处理kinect的消息
Update();
} // 处理windows消息
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函数可以看出,对kinect的处理主要在Update函数中,在看Update函数之前,我们要考虑一点,就是对象的初始化,在构造函数中,只是赋值为NULL,像m_hNextDepthFrameEvent这样的对象,它是啥时候被初始化的呢?这个就需要读者对windows窗口机制要有一些了解了,在Run的时候,调用CreateDialogParamW函数时,系统会给对话框发送窗口初始化消息WM_INITDIALOG消息,那么这些句柄的初始化,都是在窗口初始化的时候做的,所以在看Update函数之前,我们先看窗口初始化的处理:

LRESULT CALLBACK CDepthBasics::DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
// Bind application window handle
m_hWnd = hWnd; // Init Direct2D 初始化DirectX
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pD2DFactory); // Create and initialize a new Direct2D image renderer (take a look at ImageRenderer.h)
// We'll use this to draw the data we receive from the Kinect to the screen 创建图片展示对象
m_pDrawDepth = new ImageRenderer();
// 初始化展示对象,这里用到了窗口,用到了DirectX对象,以及宽度高度参数
HRESULT hr = m_pDrawDepth->Initialize(GetDlgItem(m_hWnd, IDC_VIDEOVIEW), m_pD2DFactory, cDepthWidth, cDepthHeight, cDepthWidth * sizeof(long));
if (FAILED(hr))
{
SetStatusMessage(L"Failed to initialize the Direct2D draw device.");
} // Look for a connected Kinect, and create it if found,连接kinect设备
CreateFirstConnected();
}
break;

在DlgProc的消息处理函数中我们看到了WM_INITDIALOG的处理,在这里初始化了DirectX和ImageRenderer对象,最后调用了CreateFirstConnected函数去查找和初始化Kinect对象。

下面是初始化Kinect设备代码

HRESULT CDepthBasics::CreateFirstConnected()
{
INuiSensor * pNuiSensor;
HRESULT hr; int iSensorCount = 0;
hr = NuiGetSensorCount(&iSensorCount); // 获取连接的kinect数量
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
// 获取kinect对象
hr = NuiCreateSensorByIndex(i, &pNuiSensor);
if (FAILED(hr))
{
continue;
} // Get the status of the sensor, and if connected, then we can initialize it
// 查看kinect状态,有的设备没连接电源,也许有的设备有其他异常
hr = pNuiSensor->NuiStatus();
if (S_OK == hr) // 如果有一台正常的,那我们这个程序的初始化就算完毕了,因为这个例子只用一个kinect而已
{
m_pNuiSensor = pNuiSensor;
break;
} // This sensor wasn't OK, so release it since we're not using it 如果是不正常的设备,那么Release掉,免得内存泄露
pNuiSensor->Release();
} // 如果m_pNuiSensor不为空,那表明找到某一个正常的kinect设备了
if (NULL != m_pNuiSensor)
{
// 初始化kinect,用NUI_INITIALIZE_FLAG_USES_DEPTH表示要使用深度图
hr = m_pNuiSensor->NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH);
if (SUCCEEDED(hr))
{
// 创建这个Event,这个Event是kinect和应用程序通信的Event,当kinect有消息时,kinect SDK会通过SetEvent来通知应用程序
// 应用程序则通过WaitObject来等待这个Event,完成通信
m_hNextDepthFrameEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Open a depth image stream to receive depth frames
// 打开深度图流,用来接收图像
hr = m_pNuiSensor->NuiImageStreamOpen(
NUI_IMAGE_TYPE_DEPTH, // 表示要打开深度图流
NUI_IMAGE_RESOLUTION_640x480, // 深度图大小
0, // 帧设置,0表示无设置
2, // 缓存多少帧,最大为4
m_hNextDepthFrameEvent, // 用来通信的Event句柄
&m_pDepthStreamHandle); // 用来读取数据的流句柄,要从这里读取深度图数据
}
} if (NULL == m_pNuiSensor || FAILED(hr))
{
SetStatusMessage(L"No ready Kinect found!");
return E_FAIL;
} return hr;
}

kinect for windows - DepthBasics-D2D详解之一的更多相关文章

  1. windows socket函数详解

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

  2. Python调用windows下DLL详解

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

  3. redis.windows.conf配置详解

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

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

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

  5. windows 安装Git详解

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

  6. windows curl命令详解

    概述 Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 软件下载 下载地址:https://cur ...

  7. 【JavaScript】windows.open用法详解

    windows.open("URL","窗口名称","窗口外观设定");的用法详解 function onNewWindows(redire ...

  8. Windows 消息机制详解

    总的来说: MSG包括: 窗口句柄,指示MSG发送的目的窗口 消息标识 lPARAM.wParam 发送时间 发送时的鼠标位置   关于消息队列: Windows系统有一个系统消息队列 每个线程都有一 ...

  9. Redis Windows版安装详解

    一.下载Redis Redis下载有两个途径一是官网.二是Github,由于Redis官方只支持Linux系统,所以官网是没有Windows版本的,不过微软开源团队维护了一份所以我们可以使用这个. 官 ...

  10. MySQL Windows版安装详解

    一.下载MySQL MySQL官网https://dev.mysql.com提供了Windows下的安装版msi和解压版zip,其中均包含32和64位版本,mis版本与SqlServer安装基本一致N ...

随机推荐

  1. ANDROID对文件的操作介绍

    1. Android遵循MVC设计思想: M(业务层):service V:视图(main.xml). C:Activity 2.使用文件如何对数据进行存储 Activity提供了openFileOu ...

  2. HDU1200:To and Fro

    Problem Description Mo and Larry have devised a way of encrypting messages. They first decide secret ...

  3. xcode 资源管理

    我个人觉得这么理解就够了 其他的以后再说

  4. Asp.net 提供程序模型

    需要说明一下几点 1.什么是提供程序? 2.ASP.NET 4.5 中的提供程序 3.配置提供程序 有一下几种存储状态的方式 1.应用程序状态 2.会话状态 3.高速缓存状态 4.cookie 5.查 ...

  5. xml 充当简易数据库

    后台: 写入节点 public static void Update(string path, string node, string attribute, string value) { try { ...

  6. java读取配置文件的几种方法

    java读取配置文件的几种方法 原文地址:http://hbcui1984.iteye.com/blog/56496         在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配 ...

  7. BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )

    把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...

  8. Media Queries for Standard Devices

    /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-device-width : 32 ...

  9. PHP的环境搭建

    下载开发环境 wampserver 下载sublime text 2 sublime使用技巧 1:安装漂亮的编程字体http://pan.baidu.com/s/1xMex9 下载"程序编写 ...

  10. poj 1753 Flip Game 高斯消元

    题目链接 4*4的格子, 初始为0或1, 每次翻转一个会使它四周的也翻转, 求翻转成全0或全1最少的步数. #include <iostream> #include <vector& ...