我有一个旋转平移矩阵 [RT] (3x4)。
opencv 中是否有执行 [RT] 描述的旋转平移的函数?
我有一个旋转平移矩阵 [RT] (3x4)。
opencv 中是否有执行 [RT] 描述的旋转平移的函数?
我认为这个问题的很多解决方案都做出了隐藏的假设。我将尝试快速总结一下我对这个问题的看法(过去我不得不考虑很多)。两个图像之间的变形是一个二维过程,由称为单应性的 3x3 矩阵完成。你所拥有的是一个 3x4 矩阵,它定义了一个 3 维的变换。您可以通过将图像视为 3 维空间中的平面来在两者之间进行转换。然后,诀窍是确定图像平面在世界空间中的初始位置。然后,您可以使用相机内在矩阵变换其位置并将其投影到新的图像平面上。
第一步是确定您的初始图像在世界空间中的位置,注意这不必与您的初始 R 和 T 矩阵指定的相同。那些在世界坐标中,我们说的是那个世界创建的图像,图像中的所有对象都被压平成一个平面。这里最简单的决定是将图像设置在 z 轴上的固定位移并且不旋转。从这一点开始,我将假设没有轮换。如果您想查看一般情况,我可以提供它,但它稍微复杂一些。
接下来,您在 3d 空间中定义两个图像之间的变换。由于您有两个关于同一原点的变换,因此从 [A] 到 [B] 的变换与从 [A] 到原点的变换相同,然后是从原点到 [B] 的变换。你可以通过
transform = [B]*inverse([A])
现在从概念上讲,您需要做的是拍摄您的第一张图像,将其像素投影到 3d 空间中图像的几何解释上,然后通过上面的变换在 3d 空间中转换这些像素,然后将它们投影回新的 2d 图像上你的相机矩阵。这些步骤需要组合成一个 3x3 矩阵。
cv::Matx33f convert_3x4_to_3x3(cv::Matx34f pose, cv::Matx33f camera_mat, float zpos)
{
//converted condenses the 3x4 matrix which transforms a point in world space
//to a 3x3 matrix which transforms a point in world space. Instead of
//multiplying pose by a 4x1 3d homogeneous vector, by specifying that the
//incoming 3d vectors will ALWAYS have a z coordinate of zpos, one can instead
//multiply converted by a homogeneous 2d vector and get the same output for x and y.
cv::Matx33f converted(pose(0,0),pose(0,1),pose(0,2)*zpos+pose(0,3),
pose(1,0),pose(1,1),pose(1,2)*zpos+pose(1,3),
pose(2,0),pose(2,1),pose(2,2)*zpos+pose(2,3));
//This matrix will take a homogeneous 2d coordinate and "projects" it onto a
//flat plane at zpos. The x and y components of the incoming homogeneous 2d
//coordinate will be correct, the z component is dropped.
cv::Matx33f projected(1,0,0,
0,1,0,
0,0,zpos);
projected = projected*camera_mat.inv();
//now we have the pieces. A matrix which can take an incoming 2d point, and
//convert it into a pseudo 3d point (x and y correspond to 3d, z is unused)
//and a matrix which can take our pseudo 3d point and transform it correctly.
//Now we just need to turn our transformed pseudo 3d point back into a 2d point
//in our new image, to do that simply multiply by the camera matrix.
return camera_mat*converted*projected;
}
这可能是一个比您正在寻找的更复杂的答案,但我希望它能让您了解您在问什么。这可能非常令人困惑,我很快就对它的某些部分进行了研究,请随时要求澄清。如果您需要解决方案在不假设初始图像没有旋转出现的情况下工作,请告诉我,我只是不想让它变得比需要的更复杂。