zoukankan      html  css  js  c++  java
  • OpenCV学习笔记(九) 重映射、仿射变换

    重映射

    通过重映射来表达每个像素的位置 (x,y) :

    g(x,y) = f ( h(x,y) )

    这里 g() 是目标图像, f() 是源图像, h(x,y) 是作用于 (x,y) 的映射方法函数.想象一下我们有一个图像 I , 我们想满足下面的条件作重映射:h(x,y) = (I.cols - x, y )图像会按照 x 轴方向发生翻转.

    map_x.create( src.size(), CV_32FC1 );
    map_y.create( src.size(), CV_32FC1 );
    /* 计算map_x与map_y */
    remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0, 0) );
    
    • src: 源图像
    • dst: 目标图像,与 src 相同大小
    • map_x: x方向的映射参数. 它相当于方法 h(i,j) 的第一个参数
    • map_y: y方向的映射参数. 注意 map_y 和 map_x 与 src 的大小一致。
    • CV_INTER_LINEAR: 非整数像素坐标插值标志. 这里给出的是默认值(双线性插值).
    • BORDER_CONSTANT: 默认

    map_x与map_y分别代表目标图中的(x,y)点在原图中的x坐标(由map_x提供)与y坐标(由map_y提供)。

    仿射变换

    仿射变换本质是一个2*3的矩阵M乘上原图的每个坐标,得到目标图的对应点坐标。2*3矩阵M中的2表示目标点坐标的x与y,3中的第三维是平移分量。因此需要做的就是找到矩阵M,OpenCV提供 getAffineTransform 求出仿射变换, getRotationMatrix2D 来获得旋转矩阵。

    Point2f srcTri[3];
    Point2f dstTri[3];
    
    Mat rot_mat( 2, 3, CV_32FC1 );
    Mat warp_mat( 2, 3, CV_32FC1 );
    Mat src, warp_dst, warp_rotate_dst;
    
    // 1. 找到对应点:原点+目标点
    srcTri[0] = Point2f( 0,0 );
    srcTri[1] = Point2f( src.cols - 1, 0 );
    srcTri[2] = Point2f( 0, src.rows - 1 );
    
    dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
    dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
    dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );
    
    // 2. 获得用以描述仿射变换的 2 x 3 矩阵 (在这里是 warp_mat)
    warp_mat = getAffineTransform( srcTri, dstTri );
    // 3. 将刚刚求得的仿射变换应用到源图像
    warpAffine( src, warp_dst, warp_mat, warp_dst.size() );
    
    // 1. 设置旋转参数
    Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );//旋转图像所要围绕的中心
    double angle = -50.0;// 旋转的角度. 在OpenCV中正角度是逆时针的
    double scale = 0.6;//可选择: 缩放因子
    // 2. 获得旋转矩阵, 这个函数返回一个 2 x 3 矩阵 (这里是 rot_mat)
    rot_mat = getRotationMatrix2D( center, angle, scale );
    // 3. 映射输出
    warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );
    

      

  • 相关阅读:
    Java static 静态代码块、代码块
    blog
    Java 类之间的关系
    vscode Cannot edit in read-only editor.
    以KNN为例用sklearn进行数据分析和预测
    Python 时间处理
    Python map filter reduce enumerate zip 的用法
    Python列出文件夹中的文件
    Java类只加载一次的情况
    Powershell 中的管道
  • 原文地址:https://www.cnblogs.com/ericxing/p/3580104.html
Copyright © 2011-2022 走看看