我们正在尝试构建一个简单的增强现实应用程序,该应用程序使用OpenCV来检测和跟踪来自摄像机和Three.js的框,以渲染用户可以平移和旋转摄像机的框的3D图像周围。我们几乎就在那里,但经过近两周的阅读堆栈溢出后,我们仍然停留在最后一个OpenCV步骤。
以下是我们尝试的内容:
我们有立方体,边长5厘米。使用OpenCV的校准相机,我得到了相机矩阵。接下来,我在其中一个立方体面的图像坐标和该面的对象坐标上运行solvePnP。这些是面的对象坐标:[[0,0,0],[5,0,0],[0,5,0],[5,5,0]]。
现在我对那个立方体脸有rvec和tvec。使用这个,我们运行projectPoints来获取立方体顶点其余部分的像素坐标。在图像上绘制图像是成功的,所以我们要好好直到这一点。
现在我们想要获取projectPoints返回的每个顶点的像素坐标并获取相机坐标。我们认为我们已经设法正确地翻译了这些点,但仍然无法弄清楚如何旋转它们。
我们已经尝试过我们能找到的所有解决方案,但我认为我们误解了数学或遗漏了一些微不足道的东西。有人能指出我们执行此类操作的示例代码吗?
编辑回复Micka的评论:
这里是我们尝试将旋转矩阵从Rodrigues(rvec)和tvec应用到立方体中的每个点的函数(box_coordinates看起来像这样[0,0,0],[ 5,0,0],[0,5,0] ...):
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]