opencv中的3d姿势估计

3d pose estimation in opencv

我有一个物体,上面有一些传感器,具有已知的 3d 位置,彼此相对固定方向。让我们称这个对象为“检测器”。 我在 3D 世界中检测到这些传感器中的一些位置 space。 问题:如何获得 3D 世界中“检测器”的估计姿态(位置和旋转)space。

我尝试研究 npn 问题、flann 和 orb 匹配以及异常值的 knn,但似乎他们都希望有某种相机位置。我与相机无关,我想要的只是“探测器”的姿势。考虑到 opencv 是一个“视觉”库,我什至需要 opencv 吗?

编辑:并非所有传感器都是检测器。这里用浅绿色的点表示。

您绝对不需要 openCV 来估计您的对象在 space 中的位置。

这是一个简单的优化问题,您需要最小化与模型的距离。

首先,您需要在 space 中创建物体姿态的模型。

def Detector([x, y, z], [alpha, beta, gamma]):

这应该 return 具有 3D ID 的点的所有位置的列表或数组 space。 您甚至可以为每个传感器点创建一个 class,并为整个对象创建一个 class,该对象的属性与对象上的传感器一样多。

然后您需要构建一个优化算法,以根据检测到的数据拟合您的模型。 算法应该使用态度 x、y、z、alpha、beta、gamma 作为变量。

对于 objective 函数,您可以使用类似于到相应 ID 的距离总和之类的东西。

假设您有一个 3 点对象,您想要将其拟合到 3 个数据点上

#Model
m1 = [x1, y1, z1]
m2 = [x2, y2, z2]
m3 = [x3, y3, z3]

#Data
p1 = [xp1, yp1, zp1]
p2 = [xp2, yp2, zp2]
p3 = [xp3, yp3, zp3]

import numpy as np
def distanceL2(pt1, pt2):
    distance = np.sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2 + (pt1[2]-pt2[2])**2))

# You already know you want to relate "1"s, "2"s and "3"s
obj_function = distance(m1, p1) + distance(m2,p2) + distance(m3,p3)

现在您需要深入研究优化库以找到要使用的最佳算法,具体取决于您需要优化的速度。 由于你在 space 中的点是虚拟连接的,所以这应该不会太难。 scipy.optimize 可以做到。

要缩小问题的范围,请尝试以 'detected' 点之一作为参考(就好像该度量是可信的一样),然后找到 obj_function 的最小值位置(只剩下 3 个参数需要优化,对应方向) 然后迭代您拥有的每个点。 获得最佳位置后,您可以尝试为该传感器在其周围寻找更好的位置,并查看是否再次缩短距离。

抱歉,这有点旧,但进行对象跟踪永远不会太晚:)

OpenCV SolvePNP RANSAC 应该适合你。您不需要提供初始姿势,只需为 rvectvec 制作空垫子来保存您的结果。

也因为没有相机,所以只使用 Identity 作为相机失真参数。

第一次使用空 rvectvec 调用 PNP 时确保设置 useExtrinsicGuess = false。保存好结果,使用 useExtrinsicGuess = true 将它们用于下一帧,这样可以更快地优化函数。 https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnpransac