4

我有一个旋转平移矩阵 [RT] (3x4)。

opencv 中是否有执行 [RT] 描述的旋转平移的函数?

4

1 回答 1

9

我认为这个问题的很多解决方案都做出了隐藏的假设。我将尝试快速总结一下我对这个问题的看法(过去我不得不考虑很多)。两个图像之间的变形是一个二维过程,由称为单应性的 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;
}

这可能是一个比您正在寻找的更复杂的答案,但我希望它能让您了解您在问什么。这可能非常令人困惑,我很快就对它的某些部分进行了研究,请随时要求澄清。如果您需要解决方案在不假设初始图像没有旋转出现的情况下工作,请告诉我,我只是不想让它变得比需要的更复杂。

于 2012-10-28T03:23:09.853 回答