【问题标题】:How to Combine and Display depth and rgb image using Kinect and opencv如何使用 Kinect 和 opencv 组合和显示深度和 rgb 图像
【发布时间】:2015-03-23 15:08:38
【问题描述】:

我们正在使用 kinect 和 opencv 做一个项目。我对 3D 分析完全陌生。主要目的是从kinect中获取深度和rgb信息,处理rgb mat(基本过滤和阈值函数)并将处理后的rgb图像与原始深度信息相结合。我需要基本步骤来使用合适的应用程序(opencv、opengl、openni、kinect sdk 等)

1)如何将kinect的深度和rgb信息传递给opencv?

2)我们可以单独访问rgb图像来处理它吗?

3)如何将两者结合起来,用什么函数来显示输出?

我们使用 windows-64 位和 kinect 作为 3D 传感器。我们计划使用OpenNI获取图像的rgb和深度信息,然后在OpenCV中处理rgb,然后在OpenGL的帮助下在窗口中显示图像(处理后的RGB+深度)。

【问题讨论】:

    标签: opencv opengl image-processing kinect openni


    【解决方案1】:

    首先,我认为您的问题太笼统了,这取决于您使用的库/驱动程序...例如,如果您使用 openni,那么您以一种方式传递信息,如果您使用 kinect sdk将不得不使用另一种方法...

    2) 是的,您可以独立于深度信息访问 RGB 图像并对其进行处理...

    3) 将两者结合起来,我想你的意思是深度和 rgb。这也取决于您使用的库和驱动程序。还有你想要存储它的方式,例如点云、图像等

    我的建议是准确定义您想要实现的目标、使用哪些库以及在哪个操作系统中,然后编辑您的问题。

    我使用 openni2、opencv 和 Qt 创建了一个工具,我只在 linux 中使用 primesense 摄像头和 structure.io 摄像头进行了测试,但您可能对具体要做什么有所了解。这个工具可以做一些基本的阈值处理并以不同的格式(pcd、图像、oni)保存数据。 Link

    我也用了几乎相同的方法,openni1和Avin的驱动和一个Kinect1摄像头,周三我可以上传代码,你可以看看,但基本上是一样的,只是初始化有点变化。

    作为处理 RGB-D 图像时应该做的事情的基本清单:

    • 初始化摄像头流
    • 在opencv中创建一个矩阵并将数据​​直接复制到其中,一定要阅读库的标准,例如openni使用RGB数组作为颜色矩阵,而KinectSDK使用RGBA(至少kinect SDK 2.0)。还要确保深度矩阵为 16 位。
    • 要显示深度矩阵,您必须对其进行归一化并将其更改为灰度矩阵。
    • 您可以对图像进行任何操作,然后将它们保存为所需的格式。
    • 查看我提供给您的链接,了解如何以最常见的格式保存它。

    你也可以看看点云库,他们有一个很好的包装器可以完成这项工作,然后很容易将它变成一个点云。

    希望这些信息对您有所帮助。

    更新: 对于 Windows 中的 Kinect 1,可以安装最新的 Kinect SDK 并使用 openni2,而无需安装额外的驱动程序。

    • 只需安装 Kinect SDK 1.8(不是 2.0)
    • 安装 Openni2
    • 运行 NiViewer.exe 进行测试(在 openni 文件夹中)

    如果到这里为止一切都很好,那么你只需要:

    • 初始化openni
    • 初始化颜色和深度流
    • 执行一个主循环,将其复制到 OpenCV mat(您可以使用我的code 来查看我的意思的示例)
    • 对 rgb 图像执行任何您想要的处理
    • 为 3D 显示/操作创建点云,为此我推荐点云库,因为创建点云很容易,而且他们已经有了显示。

    如果您对任何步骤有疑问,我可以给您代码 sn-ps,只需提出一个新问题,我会回答。

    希望对你有帮助

    【讨论】:

    • 我们在问题中添加了细节你能帮忙写代码吗??使 rgb Mat 进入 openCV 并最终显示 3d 图像的代码。我们只需要捕获 3D 图像并在 openCV 中进行一些阈值处理和图像处理,最后在 3D 视图中显示图像。我们完成了 OpenCV 代码。所以现在我们需要你的帮助来捕捉图像,我们需要 RGB mat 进行 opencv 处理,然后最终在 3D 视图中显示处理后的 rgb mat 和深度。
    • @AshokVarma 是 Kinect 还是 Kinect2?
    • 是 kinect 不是 kinect2
    • 非常感谢。最后一个疑问,我们可以直接将 OpenCV mat 转换为 PointCloud 吗?并且对于 3D 图像,pointColud 库比 OpenGL 更好
    • @AshokVarma 你可以把它转成点云,你只需要通过深度图像的像素,在rgb图像的同一个地方你会找到对应的颜色,z值就是深度图像像素,以及计算它所需的 x 和 y 值like this pcl 已经有几种用于点云的算法......在 opengl 中你必须自己创建它们,但你可以做更多的事情跨度>
    猜你喜欢
    • 2014-03-17
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多