基于Dragonboard 410c的kinect应用系列之三——获取深度图实例介绍

上篇文章我们介绍了simpleopenni开发平台搭建,今天小编继续为大家讲解用kinect绘制深度图与绘制人体躯干实例具体操作过程!
一 、用kinect绘制深度图 kinect+openni允许用户获得深度图像,一个红外发射头负责发射红外,另一个负责接受,这样的话我们就获得了背影射物体离摄像头有多少个像素点,也就是有多远。
在processing里面每一个工程被称为sketch而不是一般软件的project因为processing的程序运行起来更像是画家在纸上画的草图,素描风明显。
为了让深度图在电脑上显示出来,获得用户想要的数据,我们就必须导入openni,目的是导入打包好openni数据,所以首先导入数据包(库的思想)。
--------------------------------------------------------
import simpleopenni.*;
---------------------------------------------------------
接下来我们声明一个全局对象,context来和kinect来取得数据联系
--------------------------------------------------------
simpleopenni context;
---------------------------------------------------------
接下来我们来看看setup()函数,要知道一个事情,就是setup()函数里面所有的内容只执行一遍,而且只是程序一开始的阶段才被执行。
--------------------------------------------------------
void setup()
{
// 建立新的对象
context = new simpleopenni(this);
// 使能深度影响
context.enabledepth();
// 创建一个这样的尺寸,它可以保证装下深度的一切信息
size(context.depthwidth(), context.depthheight());
}
---------------------------------------------------------
接下来我们来看一下draw()里面的 函数,有关于draw()函数,它是无限循环运行的,频率是每秒60次。
-------------------------------------------------------
void draw()
{
//不断更新来自kinect camera的数据
context.update();
// 绘制深度图
image(context.depthimage(),0,0);
}
---------------------------------------------------------
context.update()函数对每一帧的数据都有更新动作
运行sketch 的结果如图所示:
代码解析如下:
import simpleopenni.*;
simpleopenni context;
void setup()
{
// instantiate a new context
context = new simpleopenni(this);
// enable depth image generation
context.enabledepth();
// create a window the size of the depth information
size(context.depthwidth(), context.depthheight());
}
void draw()
{
// update the camera
context.update();
// draw depth image
image(context.depthimage(),0,0);
}
---------------------------------------------------------------------
如果知道了深度信息,你有什么想法?
这个问题很值得在这里,仔细的思考一下,你打算做点什么?
或者是现在你没有太多想法,但是接下来的案例中我要求你必须有自己的想法,就算不会码代码。
二、 绘制人体躯干 首先呢,先要普及一下知识,有关于3d空间距离计算的知识,
在三d空间里,距离的计算,和我们在高中学得向量计算是一个道理的,下面从2d空间说起:
x1=2 x2=9
直线由两个点构成,坐标如上图已给出。
----------------------------------(直角三角形关系)
--------------------------------(a的坐标距离表示)
---------------------------------(b的坐标距离表示)
--(同样符合三角形边的关系)
--------(过渡到2d空间距离)
关键就是3d空间距离,多加了一个z坐标
上面那个公式就是3d空间里点之间里的公式。
那么怎么在代码里实现计算3d空间两点间距离。
首先,定义一个新的函数
distances3d( )
void distance3d(pvector point1, pvector point2)
{
}
在函数里面首先我们要添加一些变量来储存x,y 和 z 的值,我们还需要一个变量来储存最终的结果也就是返回值
float diff_x, diff_y, diff_z; // 储存x,y,z的值
float distance; // 来储存最后的返回值(结果也就是距离)
接下来计算两个点之间的x,y,z的差值
diff_x = point1.x - point2.x;
diff_y = point1.y - point2.y;
diff_z = point1.z - point2.z;
之后就是简单的计算
return distance; // return the distance as a float
整理之后的代码就是:
float distance3d(pvector point1, pvector point2
){
float diff_x, diff_y, diff_z;
float distance;
diff_x = point1.x - point2.x;
diff_y = point1.y - point2.y;
diff_z = point1.z - point2.z;
distance = sqrt(pow(diff_x,2)+pow(diff_y,2)+pow(diff_z,2));
return distance;
}
写好程序之后,运行结果就是这个深度图与人体躯干的形态,其中黑色是后加工的,人体颜色也是加工过的。
三、望有所思 看完这个例子千万别无动于衷,这回你一定要有好的想法,比如你想获得键盘映射、操控键盘、获得鼠标映射、控制鼠标、或者是直接获得图形映射和控制图形变化,或许你能写出个好玩的游戏。
这个话题先放一放,贪吃蛇的平台移植会很简单,所以以后我们一定要试一试,最终的结果就是:用手势控制蛇的运动方向从而控制蛇去吃更多的食物。
基础教程这里做一个完结,基础教程完毕。请期待下几期的更新!

中国光伏规模保持快速增长势头,2019年全球光伏组件产量约102GW
条形液晶屏为什么会出现黑屏现象?及解决方法介绍
手性与自旋—手性甲硫氨酸分子的自旋极化输运和光电流选择性
IBM助力基于IBM Z的企业级应用及数据的现代化改造
展讯力争成为5G芯片商用第一梯队成员
基于Dragonboard 410c的kinect应用系列之三——获取深度图实例介绍
Michael Schwarz针对人工智能经济学提出问题 并指出研究方向
关于嵌入式拼接控制器技术的应用浅析
FA5310开关电源控制IC及其应用
什么是智能传感器?发展前景如何?
鼎阳科技亮相2015年TI工业应用研讨会
车辆中的标定概述
解决手机散热这个老大难问题,这个技术够牛
以电机的最高转速为目的电子齿轮比设置
你知道智慧医院的现状吗
北斗导航系统部署全面完成,未来将给哪些智能产业带来福音?
什么是A类电能质量在线监测装置
恩智浦开启云服务安全的新时代
怎样构建高效的神经网络?
安装玻璃转子流量计时需要注意什么