我们正在使用kinect和opencv做一个项目 . 我是3D分析的新手 . 主要目的是从kinect获取深度和rgb信息,处理rgb mat(基本过滤和阈值函数)并将处理后的rgb图像与原始深度信息相结合 . 我需要基本步骤来使用合适的应用程序(opencv,opengl,openni,kinect sdk等)
1)如何将深度和rgb信息从kinect传递给opencv?
2)我们可以单独访问rgb图像来处理吗?
3)如何将两者和用于显示输出的功能结合起来?
我们使用windows-64 bit和kinect作为3D传感器 . 我们计划使用OpenNI获取图像rgb和深度信息,然后在OpenCV中处理rgb,然后在OpenGL的帮助下在窗口中显示图像(已处理的RGB深度) .
1 回答
首先,我认为你的问题太笼统了,这将取决于你使用的库/驱动程序...例如,如果你使用openni然后你以一种方式传递信息,如果你使用kinect sdk,你将不得不用另一种方法......
2)是的,你可以独立于深度信息访问RGB图像并处理它...
3)结合这两者,我想你的意思是深度和rgb . 这还取决于您使用的库和驱动程序 . 您想要存储它的方式,例如点 Cloud ,图像等
我的建议是准确定义您想要实现的目标,使用哪些库以及在哪个操作系统中编辑您的问题 .
我使用openni2,opencv和Qt创建了一个工具,我只用linux中的primesense相机和structure.io相机进行了测试,但你可能会知道该怎么做 . 该工具可以进行一些基本的阈值处理,并以不同的格式(pcd,images,oni)保存数据 . Link
我也使用了与openni1和Avin的驱动程序和Kinect1相机几乎相同的方法,周三我可以上传代码,你可以看看,但基本上是相同的,只是初始化改变了一点点 .
作为使用RGB-D图像时应该做的事情的基本清单:
初始化摄像机流
在opencv中创建矩阵并将数据直接复制到它,一定要读取库的标准,例如,openni使用RGB数组作为颜色矩阵,而KinectSDK使用RGBA(至少kinect SDK 2.0) . 还要确保深度矩阵为16位 .
要显示深度矩阵,必须对其进行标准化并将其更改为灰度矩阵 .
您可以对图像进行任何操作,然后以所需格式保存它们 .
检查我给你的链接,看看如何以最常见的格式保存它 .
此外,您可以查看Point Cloud Library,它们有一个很好的包装器可以完成这项工作,然后很容易将它变成一个pointcloud .
我希望这些信息对您有所帮助 .
UPDATE: 对于Windows中的Kinect 1,可以安装最新的Kinect SDK并使用openni2而无需安装其他驱动程序 .
只需安装Kinect SDK 1.8(不是2.0)
安装Openni2
运行NiViewer.exe来测试它的工作原理(它在openni文件夹中)
如果一切顺利,那么你只需要:
初始化openni
初始化颜色和深度流
做一个主循环,你将它复制到OpenCV垫(你可以使用我的code看一个我的意思的例子)
对rgb图像执行任何您想要的过程
为3D显示/操作创建点 Cloud ,为此我推荐Point Cloud Library,因为它很容易创建点 Cloud ,并且它们已经有了显示 .
如果你对任何步骤有疑问,我可以给你代码片段,只是问一个新的问题,我会回答它 .
我希望这可以帮助你