kinect for windows - DepthBasics-D2D详解之一
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详解之一的更多相关文章
- windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
- Python调用windows下DLL详解
Python调用windows下DLL详解 - ctypes库的使用 2014年09月05日 16:05:44 阅读数:6942 在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分 ...
- redis.windows.conf配置详解
redis.windows.conf配置详解 转自:https://www.cnblogs.com/kreo/p/4423362.html # redis 配置文件示例 # 当你需要为某个配置项指定内 ...
- 重装Windows系统 入门详解 - 基础教程
重装Windows系统 入门详解 - 基础教程 JERRY_Z. ~ 2020 / 10 / 13 转载请注明出处!️ 目录 重装Windows系统 入门详解 - 基础教程 一.说明 二.具体步骤 ( ...
- windows 安装Git详解
windows 安装Git详解 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...
- windows curl命令详解
概述 Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 软件下载 下载地址:https://cur ...
- 【JavaScript】windows.open用法详解
windows.open("URL","窗口名称","窗口外观设定");的用法详解 function onNewWindows(redire ...
- Windows 消息机制详解
总的来说: MSG包括: 窗口句柄,指示MSG发送的目的窗口 消息标识 lPARAM.wParam 发送时间 发送时的鼠标位置 关于消息队列: Windows系统有一个系统消息队列 每个线程都有一 ...
- Redis Windows版安装详解
一.下载Redis Redis下载有两个途径一是官网.二是Github,由于Redis官方只支持Linux系统,所以官网是没有Windows版本的,不过微软开源团队维护了一份所以我们可以使用这个. 官 ...
- MySQL Windows版安装详解
一.下载MySQL MySQL官网https://dev.mysql.com提供了Windows下的安装版msi和解压版zip,其中均包含32和64位版本,mis版本与SqlServer安装基本一致N ...
随机推荐
- AT&T汇编试讲--获取CPU Vendor ID
纯汇编代码如下: # a test program to get the processor vendor id # data segment .section .data output: .asci ...
- c语言中重要函数
gets函数,从标准输入读取一行文本,一行输入由一串字符组成,以一个换行符结尾: gets函数丢弃换行符,并在该行的末尾存储一个NUL字符(类似‘\0’), 然后返回一个非NULL值. 当gets函数 ...
- border-radius 知识点
border-radius:50px; 边框半径 CSS度量值都:em.px.百分比如果设置1个值,表示4个圆角都使用这个值.如果设置两个值,表示左上角和右下角使用第一个值,右上角和左下角使用第二个值 ...
- visual studio2013负载测试简单问题记录
问题1: 错误 xxxx/xx/xx xx:xx:xx 未能对测试运行“xxxxxxxxxxx”进行排队: 活动的测试设置配置为使用 Visual Studio Online 运行测试. 使用团队资源 ...
- EF的泛型封装 写的很好 转自Fly_Elephant http://www.cnblogs.com/xiaofeixiang/p/4188600.html?utm_source=tuicool
Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口, ...
- hibernate -inverse
one to many inverse=false只能设置维护关联关系的多的一方, inverse属性: 默认为false,表示本方维护关联关系. 如果为true,表示本方不维护关联关系(并不意味着对 ...
- BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)
拆点,费用流... ----------------------------------------------------------------------------- #include< ...
- C++对象模型4--有重写的单继承
有重写的单继承 派生类中重写了基类的print()函数. //Derived_Overwrite.h #pragma once #include "base.h" class De ...
- oracle 11g 物理内存 - 此先决条件将测试系统物理内存总量是否至少为 922MB (944128.0KB)
- selenium 学习笔记 ---新手学习记录(4) 问题总结(java)-autoit3脚本使用
1.安装autoit3 下载地址:点我下载 (提取码:9633) 提取码 下载完成后,一直下一步即可 2.上传头像使用脚本 代码如下: ControlFocus("打开",&quo ...