问题已重新发送以添加清晰度
我正在与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
如上所述,如果我的目标点都是平面的,则此解决方案有效。但是,如果在其他平面上存在点,则解决方案将失效并且非常错误。
谢谢!
答案 0 :(得分:2)
(很抱歉忘了跟进)
计算旋转矩阵的determinant。对于“正确”的答案,它应该为= 1,对于翻转的答案,它应该为-1。然后,只需将旋转乘以identity矩阵即可,最后一项是行列式。如果det()= 1则不执行任何操作,但如果det()= -1则将其翻转回正确答案
您可能会发现POSE ESTIMATION FOR PLANAR TARGET上的代码/讨论很有用