【发布时间】:2019-05-03 05:19:14
【问题描述】:
转贴问题以增加清晰度
我正在使用 OpenCV 尝试校准激光扫描仪。
我有一组由扫描仪捕获的二维点。为了这个例子,让我们将这些点表示如下:
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)并取回捕获坐标系中的 2d 点。
到目前为止,我的结果表明,如果对象点是共面的,那么 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。
问题:
使用给定的图像点和对象点如何使用 OpenCV(或其他方法)来获得解决方案。
我已经尝试过的:
我已经尝试过 OpenCV 中的基本 SolvePNP,如下所示:
Cv2.SolvePnP(objectPoints, imagePoints, camMatrix, dist, out double[] rvec, out double[] tvec, false, SolvePnPFlags.Iterative);
Documentation on SolvePNP Here
如上所述,如果我的对象点都是平面的,则此解决方案有效。但是对于其他平面上的点,解决方案会失效并且非常错误。
提前致谢!
【问题讨论】:
-
SolvePnP 适用于任何 3d 点,您确定图像点和对象点具有相同的坐标系统吗?并且你有正确的对应关系
-
@MartinBeckett 我敢肯定,是的。我在对象点是平面且没有问题的情况下使用完全相同的解决方案。一旦对象点不是平面的,就会出现问题。
-
SolvePnP 可以提供翻转的解决方案。检查旋转矩阵的行列式(),您可以使用它来正确翻转轴。
-
你能再具体一点吗?取行列式后,我得到了双倍的价值。我应该在这个 double 值中寻找什么,我应该翻转什么以使解决方案正确
-
@MartinBeckett 所以我做了一些实验,我确实看到我的轮换矩阵上有一些不正确的迹象(但只是有时)。一个好的解决方案和一个坏的解决方案的决定因素都是 1(或接近 1,例如 0.99999997)
标签: opencv computer-vision augmented-reality opencvsharp