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 应该适合你。您不需要提供初始姿势,只需为 rvec
和 tvec
制作空垫子来保存您的结果。
也因为没有相机,所以只使用 Identity 作为相机失真参数。
第一次使用空 rvec
和 tvec
调用 PNP 时确保设置 useExtrinsicGuess = false
。保存好结果,使用 useExtrinsicGuess = true
将它们用于下一帧,这样可以更快地优化函数。
https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnpransac
我有一个物体,上面有一些传感器,具有已知的 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 应该适合你。您不需要提供初始姿势,只需为 rvec
和 tvec
制作空垫子来保存您的结果。
也因为没有相机,所以只使用 Identity 作为相机失真参数。
第一次使用空 rvec
和 tvec
调用 PNP 时确保设置 useExtrinsicGuess = false
。保存好结果,使用 useExtrinsicGuess = true
将它们用于下一帧,这样可以更快地优化函数。
https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnpransac