我有一个带有一些传感器的对象,其具有相对于彼此固定方向的已知 3d 位置。我们称这个对象为“检测器”。我在 3D 世界空间中检测到了其中一些传感器的位置。 问题:如何在 3D 世界空间中获得“检测器”的估计姿势(位置和旋转)。
我尝试研究 npn 问题,flann 和 orb 匹配以及异常值的 knn,但似乎他们都期望某种相机位置。我与相机无关,我想要的只是“探测器”的姿势。考虑到 opencv 是一个“视觉”库,我什至需要 opencv 吗?
我有一个带有一些传感器的对象,其具有相对于彼此固定方向的已知 3d 位置。我们称这个对象为“检测器”。我在 3D 世界空间中检测到了其中一些传感器的位置。 问题:如何在 3D 世界空间中获得“检测器”的估计姿势(位置和旋转)。
我尝试研究 npn 问题,flann 和 orb 匹配以及异常值的 knn,但似乎他们都期望某种相机位置。我与相机无关,我想要的只是“探测器”的姿势。考虑到 opencv 是一个“视觉”库,我什至需要 opencv 吗?
抱歉,这有点旧,但做对象跟踪永远不会太晚:)
OpenCV SolvePNP RANSAC 应该适合你。您不需要提供初始姿势,只需制作空垫子rvec
并tvec
保存您的结果。
也因为没有相机,只需使用 Identity 作为相机失真参数。
第一次使用空调用 PNPrvec
并tvec
确保设置useExtrinsicGuess = false
. 如果结果好,请保存您的结果,将它们用于下一帧,useExtrinsicGuess = true
以便更快地优化功能。
https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnpransac
你绝对不需要 openCV 来估计你的对象在空间中的位置。
这是一个简单的优化问题,您需要最小化与模型的距离。
首先,您需要创建对象在空间中的姿态模型。
def Detector([x, y, z], [alpha, beta, gamma]):
它应该返回一个列表或数组,其中包含 3D 空间中具有 ID 的点的所有位置。您甚至可以为这些传感器点中的每一个创建一个类,并为整个对象创建一个类,该类具有与对象上的传感器一样多的属性。
然后,您需要构建一个优化算法,以将您的模型拟合到检测到的数据上。该算法应该使用姿态 x, y, z, alpha, beta, gamma 作为变量。
对于目标函数,您可以使用到相应 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)
现在,您需要深入研究优化库以找到要使用的最佳算法,具体取决于您需要优化的速度。由于您在空间中的点实际上是连接的,因此这应该不会太难。scipy.optimize 可以做到。
为了减少您的问题的维度,请尝试将“检测到”点之一作为参考(好像该度量值得信任),然后找到该位置的 obj_function 的最小值(只剩下 3 个参数需要优化,对应于方向),然后对你拥有的每个点进行迭代。获得最佳位置后,您可以尝试在其周围为该传感器寻找更好的位置,并查看是否再次缩短距离。