Javascript 在已知尺寸的立方体面上运行solvePnP后,如何获取顶点的摄影机坐标?

Javascript 在已知尺寸的立方体面上运行solvePnP后,如何获取顶点的摄影机坐标?,javascript,python,opencv,three.js,virtual-reality,Javascript,Python,Opencv,Three.js,Virtual Reality,我们正在尝试构建一个简单的增强现实应用程序,该应用程序使用OpenCV检测和跟踪来自摄影机的长方体,并使用Three.js渲染长方体的3D图像,用户可以平移和旋转摄影机。我们就快到了,但是在读堆栈溢出将近两周之后,我们被困在了OpenCV的最后一步 以下是我们尝试过的: 我们有边长为5厘米的立方体。使用OpenCV的校准摄像机,我得到了摄像机矩阵。接下来,我对立方体的一个面的图像坐标和该面的对象坐标运行solvePnP。这些是面的对象坐标:[[0,0,0],[5,0,0],[0,5,0],[5,

我们正在尝试构建一个简单的增强现实应用程序,该应用程序使用OpenCV检测和跟踪来自摄影机的长方体,并使用Three.js渲染长方体的3D图像,用户可以平移和旋转摄影机。我们就快到了,但是在读堆栈溢出将近两周之后,我们被困在了OpenCV的最后一步

以下是我们尝试过的:

我们有边长为5厘米的立方体。使用OpenCV的校准摄像机,我得到了摄像机矩阵。接下来,我对立方体的一个面的图像坐标和该面的对象坐标运行solvePnP。这些是面的对象坐标:[[0,0,0],[5,0,0],[0,5,0],[5,5,0]]

现在我有了这个立方体面的rvec和tvec。使用这个,我们运行以获得立方体其余顶点的像素坐标。在图像上绘制这一点是成功的,所以我们在这一点上做得很好

现在我们要获取由projectPoints返回的每个顶点的像素坐标,并获取相机坐标。我们认为我们已经成功地正确地转换了这些点,但仍然无法确定如何旋转它们

我们已经尝试了我们能找到的每一个解决方案,但我认为我们误解了数学或者遗漏了一些琐碎的东西。有人能给我们指出一些执行这种类型操作的示例代码吗

编辑以回复米卡的评论:

这是我们用来尝试将Rodrigues(rvec)和tvec的旋转矩阵应用于立方体中每个点的函数(长方体坐标看起来像[0,0,0],[5,0,0],[0,5,0]…):


不确定我是否理解了这个问题,但在我看来,您只需将rvec和tvec转换为4D同质转换(请参阅rvec的opencv rodriguez函数),然后在同质立方体/对象/任何坐标上相乘。@Mika感谢您的回答。我们认为我们正在尝试,但是因为我们没有完全理解数学,我们可能做错了什么。我已经用我们在这一部分中使用的代码更新了这个问题,你介意看一看吗?对不起,不确定python语法。它基本上是将rvecs转换成一个旋转矩阵,存储在rot_mat中。然后我们取rot_mat的点积,指向并向其添加TVEC。这听起来像是正确的操作和顺序吗?不是100%确定,我做了所有这些事情已经有一段时间了,如果你只计算4x4变换矩阵(同质坐标中的三维空间)会更容易。不确定我是否理解这个问题,但在我看来,你只需要将rvec和tvec转换为4D同质变换(请参见rvec的opencv rodriguez函数)然后在你的同质立方体/对象/任意坐标上乘法。@Mika谢谢你的回答。我们认为我们正在尝试这个,但是因为我们不完全理解数学,我们可能做错了什么。我已经用我们在这一部分中使用的代码更新了这个问题,你介意看一下吗?对不起,不确定python语法。这是BasicCally将rvecs转换成旋转矩阵,存储在rot_mat中。然后我们将rot_mat的点积和点加上TVEC。这听起来像是正确的操作和顺序吗?不是100%确定,我做了所有这些事情已经有一段时间了,如果你只计算4x4变换矩阵会更容易(同质坐标中的三维空间)。
def rotate_translate_point(point, rvecs, tvecs):
    rot_mat, _ = cv2.Rodrigues(rvecs)
    point = np.dot(rot_mat, point)
    point = map(sum, zip(point, tvecs))  # translate by tvec
    return point

def rotate_box_and_translate(box_coordinates, rvecs, tvecs):
    return [rotate_translate_point(point, rvecs, tvecs) for point in box_coordinates]