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

5

我正在尝试从翻译、旋转、缩放、剪切等单个组件创建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;
}

请查看:https://docs.opencv.org/3.4.0/da/d6e/tutorial_py_geometric_transformations.html - John_Sharp1318
这个链接展示了如何从点对中推导出透视变换。我想要操作透视变换的不同组成部分。目前我有旋转、平移、缩放、剪切作为变换组成部分。还有其他负责透视变换的组成部分吗? - Vinmean
1个回答

8
关键词是Homography8DOF。从12中获取透视变换的两个系数。但需要第二步计算。我不熟悉OpenCV,但希望以基本方式稍晚回答您的问题 ;-)

步骤1

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

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

lx/ly are perspective foreshortening parameters

enter image description here

第二步

当您应用右手矩阵乘法 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/2ty=-h/2 = P1。
  2. 使用投影映射 ly = h(使两侧呈角度)。
  3. 最终将所有点平移回一个象限。
  4. 最终按所需大小进行缩放。

透视投影的第2步可以在2.)之后或最后完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接