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

Using OpenCV to Solve for Transform between non planar object Points and image points

重新发布问题以增加清晰度

我正在使用 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 几乎可以完美地找到 rotation/translation 结果。

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

我知道这是可能的(不一定使用 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

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

提前致谢!

(抱歉忘了跟进)

计算 determinant of the rotation matrix. It should be =1 for a 'correct' answer and -1 for the flipped one. Then simply multiply the rotation by a identity 矩阵,其中最后一项是行列式。如果 det() =1,这什么都不做,但如果 det() = -1

,则将其翻转回正确答案

您可能会发现 POSE ESTIMATION FOR PLANAR TARGET 上的 code/discussion 很有用