我有一个Kinect相机和一个网络摄像头,我正在尝试使用OpenCV找到Kinect和网络摄像头之间的旋转/翻译矩阵。以下是设置:

两个相机面向相同的方向。我可以获得两个相机的内在矩阵,但我不确定如何获得它们之间的相对位置吗?

我做了一些研究,发现了 findesentialmat()功能。显然它返回一个必要的矩阵(但是这种功能似乎不适合,因为它假设两个相机中的焦点和原理点相同),可以使用:

  1. refoction()
  2. decompositionalmat() - >如果我理解,它将返回4个不同的解决方案,如果我使用这个函数?
  3. 非常谢谢!

    编辑:立体alibrate()功能怎么样?但我的设置并不对应于立体声相机..

    编辑2:我尝试使用OpenCV提供的“立体声_calib.cpp”示例。这是我的结果,我真的不知道如何解释它吗?

    还,它会产生一个“外在的.MYR”文件,在那里我可以找到R和T矩阵,但我不知道它们所代表的单位?我多次更改了源代码中的Squarize变量,但似乎矩阵根本不会改变。

有帮助吗?

解决方案

我认为,如果您对深度映射和对齐2张图像感兴趣,那么stereoCalibrate就是工作的方式,即使我不知道您不知道您想要做的事情,也是一个重要问题即使您已经从Kinect有一个深度图)。

但是,如果我理解它需要您需要的东西,您还想在世界上找到相机的位置。您可以通过在两个视图中具有相同的已知几何体来做到这一点。这通常通过躺在地板中的棋盘图案来实现,由(固定位置)相机发送。

一旦你有一个已知的几何3D点,并且在图像平面中投射的Cormetive 2D点,就可以在考虑到棋盘的一个边缘的世界中,独立地找到相机相对于3D世界的3D位置。

以这种方式,您将实现的内容是如此图片:

要找到相机相对于棋盘的3D位置,您可以使用cv::solvePnP独立地为每个相机找到外部矩阵。关于相机方向的一些问题(从相机到原点世界指向的光线),并且如果要可视化它们(如OpenGL),则必须处理它们(相同的:为每个摄像机独立地)。一些矩阵代数也是角度处理。

对于数学的详细描述,我可以将你的名为着名的多视图几何形状

另见我的上一个 opencv和opengl 之间的增强现实和集成的答案(即热量使用外在基质和<强> T 和 R 矩阵,这些矩阵可以从中分解并且代表世界上相机的位置和方向)。

只是为了好奇心:你为什么用正常的相机加上kinect? Kinect为您提供了深度地图,我们尝试使用2个立体声相机实现。我不明白额外的正常相机的数据可以让您更多的数据可以让您更好地使用外在矩阵的校准的Kinect。

ps图像拍摄来自这个漂亮的opencv 介绍性博客,但我认为该帖子与您的问题没有太大相关,因为该帖子是关于似乎您已经拥有的intrisinc矩阵和失真参数。只是为了澄清。

编辑:当您谈论外在数据的单位时,您通常在棋盘的3D点的相同单元中测量它们,因此如果您识别平方棋盘边缘点在3D中用P(0,0)p(1,0)p(1,1)p(0,1)并使用solvePnP,相机的翻译将在“棋盘边缘尺寸”的单位中测量。如果是1米长,则测量单位将是米。对于旋转,该单元通常是弧度中的角度,但这取决于如何用cv::Rodrigues提取它们以及如何从旋转矩阵中获取3个角度的播放音调滚动。

其他提示

使用立体丙匹配。您的设置与立体声相机一样。

只是把Kinect放在你的网络相机后面。Kinect将为您从其深度图提供网络摄像头的翻译。可以通过刚性连接到腹板照相机的平面来计算相关旋转。如果您不在乎的准确性,这将有效,并且我假设在这种情况下立体声是无关紧要的,因为Kinect给了你深度地图。

如果您需要更准确的结果,您需要指定您的目标。例如,立体声校准的目标是生成两个可以应用于每个相机图像的同封矩阵,以便纠正它们或换句话说,使像素对应关系位于同一列(用于设置)。这简化了搜索立体声匹配。你的目标是什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top