如何从单个组件创建2D透视变换矩阵?

时间:2018-08-05 04:50:45

标签: opencv transformation perspective affinetransform

我正在尝试从单个组件(例如平移,旋转,缩放,剪切)创建2D透视变换矩阵。但是最后,矩阵并没有像下面的图像那样产生真正的透视效果。我想我在编写用于创建矩阵的代码中缺少某些组件。有人可以帮助我在以下功能中添加缺少的组件及其表示形式吗?我已将opencv库用于我的代码

enter image description here

cv::Mat getPerspMatrix2D( double rz, double s, double tx, double ty ,double shx, double shy)
{

cv::Mat R = (cv::Mat_<double>(3,3) <<
        cos(rz), -sin(rz), 0,
        sin(rz), cos(rz), 0,
        0, 0, 1);

cv::Mat S = (cv::Mat_<double>(3,3) <<
        s, 0, 0,
        0, s, 0,
        0, 0, 1);


cv::Mat Sh = (cv::Mat_<double>(3,3) <<
        1, shx, 0,
        shy, 1, 0,
        0, 0, 1);


cv::Mat T = (cv::Mat_<double>(3,3) <<
        1, 0, tx,
        0, 1, ty,
        0, 0, 1);

return T * Sh * S * R;
}

1 个答案:

答案 0 :(得分:0)

关键字是 Homography 8DOF 。取自12,存在两个用于透视变换的系数。但是它需要第二步来计算它。我不熟悉OpenCV,但我希望以一种基本的方式稍晚回答您的问题;-)

步骤1

您可以想象lx在x轴上描述了一个消失点。该图像显示a31 = lx = 1。 lx = 100是较少的变换。对于1x = 0,位置是无限远的,意味着没有透视变换=单位矩阵。

     [1  0  0] 
PL = [0  1  0] 
     [lx ly 1]

lx/ly are perspective foreshortening parameters

enter image description here

步骤2

当您应用右手矩阵乘法P x [u; v; 1],您会发现结果中的最后一个值有时不是1。对于仿射变换,对于透视投影,它始终为1。在第二步中,将结果缩放以使最后一个系数为1。这是效果的一部分。

enter image description here

您的示例图片

 Image' = P4 x P3 x P2 x P1 x Image
  1. 我会将蓝色矩形的中心转换为原点tx=-w/2,并且ty=-h/2 = P1。
  2. ly = h应用投影投影(使两边成一个角度)
  3. 最终将所有点都平移到一个象限中
  4. 最终缩放到所需大小

从透视投影中进行的步骤2可以在2.)之后或最后完成。