使用OpenCV解决非平面对象点和图像点之间的变换

时间:2018-12-01 05:03:46

标签: opencv computer-vision augmented-reality opencvsharp

问题已重新发送以添加清晰度

我正在与OpenCV一起尝试校准激光扫描仪。

我有一组由扫描仪捕获的2d点。为了示例,让我们将这些点表示为:

IMAGE POINTS
{(0.08017784, -0.08993121, 0)}
{(-0.1127666, -0.08712908, 0)}
{(-0.1117229, 0.1782855, 0)}
{(0.09053531, 0.198439, 0)}

我知道这些点对应于以下现实世界点:

OBJECT POINTS
{(0, 0, 0)}
{(190, 0, 0)}
{(190, 260, 0)}
{(0, 260, 122)}

我一直在使用OpenCV来求解旋转和平移矩阵,这将使我能够给出一个世界点(例如100、200、20)并在捕获的坐标系中获取第二个点。

到目前为止,我的结果表明,如果对象点共面,则OpenCV几乎可以完美地找到旋转/平移结果。

但是,在上面我给出的示例(并非所有要点都位于同一平面上)的问题中,我得到的答案非常错误。

我知道这是可能的(不一定是openCV),因为我有另一个商业软件可以做到这一点。作为参考,上述问题的解决方案是矩阵:

SOLUTION
[-0.99668, 0.03056, 0.07543]
[ 0.05860, 0.91263, 0.40454]
[-0.05647, 0.40762,-0.91140]
[79.34385, -89.63855,-982.25938]

我正在使用均方根误差来确定结果的有效性。我提供的解决方案的均方根误差为1.61560。而OpenCV的结果超过1000。

问题:

使用给定的IMAGE POINTS和OBJECT POINTS,如何使用OpenCV(或其他方法)获得解决方案。

我已经尝试过的方法:

我已经尝试过像OpenCV这样的基本SolvePNP:

Cv2.SolvePnP(objectPoints, imagePoints, camMatrix, dist, out double[] rvec, out double[] tvec, false, SolvePnPFlags.Iterative);

Documentation on SolvePNP Here

如上所述,如果我的目标点都是平面的,则此解决方案有效。但是,如果在其他平面上存在点,则解决方案将失效并且非常错误。

谢谢!

1 个答案:

答案 0 :(得分:2)

(很抱歉忘了跟进)

计算旋转矩阵的determinant。对于“正确”的答案,它应该为= 1,对于翻转的答案,它应该为-1。然后,只需将旋转乘以identity矩阵即可,最后一项是行列式。如果det()= 1则不执行任何操作,但如果det()= -1则将其翻转回正确答案

您可能会发现POSE ESTIMATION FOR PLANAR TARGET上的代码/讨论很有用