- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在玩 Kinect 驱动程序 CL NUI 并尝试获取项目的相对深度。
库提供了一种获取表示屏幕上对象深度的图像的方法。这是一个例子:
有没有一种简单的方法可以将像素颜色转换为图像深度?例如,最近的颜色可以是深度 0,最远的颜色可以是深度 1。
有人知道怎么做吗?
我发现了这些关于如何将深度数据转换为颜色的计算,我想要的是相反的:
float RawDepthToMeters(int depthValue)
{
if (depthValue < 2047)
{
return float(1.0 / (double(depthValue) * -0.0030711016 + 3.3309495161));
}
return 0.0f;
}
Vec3f DepthToWorld(int x, int y, int depthValue)
{
static const double fx_d = 1.0 / 5.9421434211923247e+02;
static const double fy_d = 1.0 / 5.9104053696870778e+02;
static const double cx_d = 3.3930780975300314e+02;
static const double cy_d = 2.4273913761751615e+02;
Vec3f result;
const double depth = RawDepthToMeters(depthValue);
result.x = float((x - cx_d) * depth * fx_d);
result.y = float((y - cy_d) * depth * fy_d);
result.z = float(depth);
return result;
}
Vec2i WorldToColor(const Vec3f &pt)
{
static const Matrix4 rotationMatrix(
Vec3f(9.9984628826577793e-01f, 1.2635359098409581e-03f, -1.7487233004436643e-02f),
Vec3f(-1.4779096108364480e-03f, 9.9992385683542895e-01f, -1.2251380107679535e-02f),
Vec3f(1.7470421412464927e-02f, 1.2275341476520762e-02f, 9.9977202419716948e-01f));
static const Vec3f translation(1.9985242312092553e-02f, -7.4423738761617583e-04f, -1.0916736334336222e-02f);
static const Matrix4 finalMatrix = rotationMatrix.Transpose() * Matrix4::Translation(-translation);
static const double fx_rgb = 5.2921508098293293e+02;
static const double fy_rgb = 5.2556393630057437e+02;
static const double cx_rgb = 3.2894272028759258e+02;
static const double cy_rgb = 2.6748068171871557e+02;
const Vec3f transformedPos = finalMatrix.TransformPoint(pt);
const float invZ = 1.0f / transformedPos.z;
Vec2i result;
result.x = Utility::Bound(Math::Round((transformedPos.x * fx_rgb * invZ) + cx_rgb), 0, 639);
result.y = Utility::Bound(Math::Round((transformedPos.y * fy_rgb * invZ) + cy_rgb), 0, 479);
return result;
}
我的矩阵数学很弱,我不知道如何逆向计算。
最佳答案
我找到了解决方案。
深度值存储在 CLNUIDevice.GetCameraDepthFrameRAW
图像中。此图像的颜色是根据 11 位深度值创建的。 IE。 RGB 颜色有 24 位(如果是 ARGB,则为 32 位)。要获得深度,您需要像这样截断不必要的位:
private int colorToDepth(Color c) {
int colorInt = c.ToArgb();
return (colorInt << 16) >> 16;
}
您使用 16,因为 11 位数字在 16 位位置补了 0。 IE。你有一个看起来像这样的数字: 1111 1111 0000 0### #### #### 其中 1 是 alpha channel ,零是填充,'#' 是实际值。向左移动 16 位后,您将得到 0000 0### #### #### 0000 0000,您想要将我向右移动 16 次后推:0000 0000 0000 0### ##### ####
关于c# - 使用 CL NUI Kinect 驱动程序,将深度颜色转换为实际相对距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763320/
注意:我的设备是 xbox 360 kinect 设备而不是 kinect for windows。我尝试过不同的 Linux 内核和不同的 libfreenect 编译,但没有雪茄。 连接线上的灯呈
在过去的几个月里,我一直在研究为各种软件音乐合成器开发基于 Kinect 的多点触控界面。 我提出的总体策略是以编程方式或(如果可能)算法方式创建对象来表示软合成器的各种控制。这些应该有; X 位置
我使用 NUI ( https://github.com/tombenner/nui ),我想在按钮中显示具有特定字体和大小的文本。这是我的“css”文件: accessoryButton {
有没有人使用 NUI 与 Swift 和 CocoaPods 一起工作? NUI 是适用于 iOS 的嵌入式 UI 工具包,可让您使用类似于 CSS 的样式表来设置 UI 元素的样式。它可以让您在几分
我正在玩 Kinect 驱动程序 CL NUI 并尝试获取项目的相对深度。 库提供了一种获取表示屏幕上对象深度的图像的方法。这是一个例子: 有没有一种简单的方法可以将像素颜色转换为图像深度?例如,最近
我是一名优秀的程序员,十分优秀!