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

Kik*_*two 5 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)}
Run Code Online (Sandbox Code Playgroud)

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

OBJECT POINTS
{(0, 0, 0)}
{(190, 0, 0)}
{(190, 260, 0)}
{(0, 260, 122)}
Run Code Online (Sandbox Code Playgroud)

我一直在使用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]
Run Code Online (Sandbox Code Playgroud)

我使用均方根误差来确定结果的有效性.我提供的解决方案的均方根误差是1.61560.虽然OpenCV的结果超过了1000.

问题:

使用给定的图像点和对象点如何使用OpenCV(或其他方法)来获得解决方案.

我已经尝试过的:

我从OpenCV尝试过基本的SolvePNP,如下所示:

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

有关SolvePNP的文档

如上所述,如果我的对象点都是平面的,则此解决方案有效.但是对于其他平面上的点,解决方案会崩溃并且非常错误.

提前致谢!

Mar*_*ett 4

(抱歉忘记跟进了)

计算旋转矩阵的行列式“正确”答案应为 =1,翻转答案应为 -1。然后简单地将旋转乘以单位矩阵,其中最后一项是行列式。如果 det() =1,这不会执行任何操作,但如果 det() = -1,则将其翻转回正确答案

您可能会发现有关平面目标的姿势估计的代码/讨论很有用