OpenCV:关于solvePnP的困惑

3

我对OpenCV中的solvePnP函数的使用有些困惑。

我有相机内参矩阵,并在图像中识别了一些关键点,现在我正在尝试估计标定的外参参数。

solvePnP的文档如下:

cv2.solvePnP(objectPoints, imagePoints, cameraMatrix, 
distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]]) → retval, rvec, tvec

我猜我的imagePoints参数是我检测到的关键点,并且这些关键点以像素为单位指定,例如(x1, y1), (x2, y2), (x3, y3)

我对objectPoints完全感到困惑。因此,文档中说:

objectPoints – Array of object points in the object coordinate space,
3xN/Nx3 1-channel or 1xN/Nx1 3-channel, where N is the number of points.
vector<Point3f> can be also passed here.

我该如何从我的图像点生成这些物体点?当他们在这里说对象坐标空间时,这意味着什么?

1个回答

4
cv2.solvePnP() 方法通常用于姿态估计,换句话说,它可用于估计 3D 对象在 2D 图像中的方向。因此,您需要在对象的 3D 模型中标记一些关键点(objectPoints),并在 2D 图像中检测这些关键点(imagePoints)。您可以参考这个答案,了解该技术在面部姿态估计中的应用。

谢谢你的回答。我对3D对象的坐标系统感到困惑。图像中的关键点是相对于图像左上角给出的像素。那么3D对象呢?我可以任意设置坐标系吗?例如,可以将检测到的关键点之一设置为3D坐标系的原点,并将所有其他关键点定义为相对于此关键点的位置吗? - Luca
2
是的,它们可以是任意的。这个系统需要至少6个点才能稳健地工作,只要您提供了6个点,3D点就可以是任意的。 - ZdaR
谢谢!非常感谢。单位将是3D模型测量的单位,我猜想内部矩阵也应该是以这个单位表示的吧? - Luca
1
我不确定内部矩阵,因为我的相机已经校准过了,所以我有点硬编码这些值。在我的附加答案中,您可以查看其他链接以满足您的查询。 - ZdaR
1
据我所知,如果在本征和物体点之间使用不同的单位,则计算出的物体姿态中将会存在一些比例因子。 - Micka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接