zoukankan      html  css  js  c++  java
  • OpenCV 几何图像变换-cv::getAffineTransform(仿射变换)

    cv::getAffineTransform
    仿射变换

    (1)一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)。
    所以,我们能够用仿射变换来表示:

    旋转(线性变换)
    平移(向量加)
    缩放操作(线性变换)
    仿射变换代表的是两幅图之间的联系。
    我们通常使用矩阵来表示仿射变换。

     考虑到我们要使用矩阵对二维向量做变换, 所以也能表示为下列形式:

     

     

    (2)求仿射变换
    上文有提到过仿射变换基本表示的就是两幅图片之间的联系。关于这种联系的信息大致可从以下两种场景获得:
    我们已知 和T而且我们知道他们是有联系的。接下来我们的工作就是求出矩阵
    我们已知 Xand T。要想求得 。我们只要应用算式即可。对于这种联系的信息可以用矩阵M清晰的表达(即给出明确的2×3矩阵)或者也可以用两幅图片点之间几何关系来表达.

    因为矩阵联系着两幅图片,我们以其表示两图中各三点直接的联系为例。见下图:

    点1,2和3(在图一中形成一个三角形)与图二中三个点一一映射, 仍然形成三角形,但形状已经大大改变。如果我们能通过这样两组三点求出仿射变换(你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点。

    Opencv接口

    1 Mat cv::getAffineTransform(const Point2f src[],
    2         const Point2f dst[] 
    3 4 参数
    5 src    源图像中三角形顶点的坐标。
    6 dst    目标图像中相应三角形顶点的坐标。

    从三对对应点计算仿射变换。
    该函数计算2×3矩阵的仿射变换为:

     

     1 void ES::ImageProcessing::affineTransformOper(cv::Mat* dst)
     2 {
     3     Mat src = imread("lena.jpg", IMREAD_COLOR);
     4     cv::resize(src, src, Size(src.rows / 4 * 3, src.cols / 4 * 3));
     5     ImageProcessingParams* img_params = static_cast<ImageProcessingParams*>(m_params);
     6     //源图像和目标图像上分别一一映射的三个点
     7     Point2f srcTri[3];
     8     Point2f dstTri[3];
     9     srcTri[0] = Point2f(0, 0);
    10     srcTri[1] = Point2f(src.cols - 1, 0);
    11     srcTri[2] = Point2f(0, src.rows - 1);
    12 //     dstTri[0] = Point2f(src.cols*0.0, src.rows*0.33);
    13 //     dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25);
    14 //     dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7);
    15     for (int index = 0; index < img_params->m_ptScales.size() / 2; ++index)
    16     {
    17         dstTri[index] = Point2f(img_params->m_ptScales[2 * index] * src.cols, 
    18             img_params->m_ptScales[2 * index + 1] * src.rows);
    19     }
    20     //通过这两组点, 使用getAffineTransform来求出仿射变换
    21     Mat warp_mat(2, 3, CV_32FC1);
    22     warp_mat = getAffineTransform(srcTri, dstTri);
    23     //求得的仿射变换应用到源图像
    24     Mat mat;
    25     warpAffine(src, mat, warp_mat, mat.size());
    26     //
    27     Mat mergeMat(src.rows, src.cols + mat.cols, src.type());
    28     Mat submat = mergeMat.colRange(0, src.cols);
    29     src.copyTo(submat);
    30     submat = mergeMat.colRange(src.cols, src.cols + mat.cols);
    31     mat.copyTo(submat);
    32     mergeMat.copyTo(*dst);
    33 }

     

  • 相关阅读:
    PostgreSQL学习的九层宝塔
    MySQL和PostgreSQL在多表连接算法上的差异
    覆盖equals 时总要覆盖hashCode(9)
    覆盖equals 时总要覆盖hashCode(9)
    覆盖equals 时总要覆盖hashCode(9)
    覆盖equals 时总要覆盖hashCode(9)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
    SQL Server 字段和对应的说明操作(SQL Server 2005 +)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15043714.html
Copyright © 2011-2022 走看看