zoukankan      html  css  js  c++  java
  • opencv 中affine函数实现旋转和平移

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的。

    1、图像的旋转

    图像的旋转具体实现分为两步:先根据旋转角度和旋转中心获取旋转矩阵;然后根据旋转矩阵进行仿射变换,即可实现任意角度和任意中心的旋转效果。旋转矩阵的形式如下:

    其中,

    具体代码如下:

    cv::Mat src = cv::imread("lenna.jpg");  
    cv::Mat dst;  
      
    //旋转角度  
    double angle = 45;  
      
    cv::Size src_sz = src.size();  
    cv::Size dst_sz(src_sz.height, src_sz.width);  
    int len = std::max(src.cols, src.rows);  
      
    //指定旋转中心  
    cv::Point2f center(len / 2., len / 2.);  
      
    //获取旋转矩阵(2x3矩阵)  
    cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);  
      
    //根据旋转矩阵进行仿射变换  
    cv::warpAffine(src, dst, rot_mat, dst_sz);  
      
    //显示旋转效果  
    cv::imshow("image", src);  
    cv::imshow("result", dst);  
      
    cv::waitKey(0);  
      
    return 0;  
    
     

    结果如下:

    2、图像的平移

    图像的平移也分为两步:首先定义好图像的平移矩阵,分别指定x方向和y方向上的平移量tx和ty,平移矩阵的形式如下:

    cv::Mat src = cv::imread("lenna.jpg");  
    cv::Mat dst;  
      
    cv::Size dst_sz = src.size();  
      
    //定义平移矩阵  
    cv::Mat t_mat =cv::Mat::zeros(2, 3, CV_32FC1);  
      
    t_mat.at<float>(0, 0) = 1;  
    t_mat.at<float>(0, 2) = 20; //水平平移量  
    t_mat.at<float>(1, 1) = 1;  
    t_mat.at<float>(1, 2) = 10; //竖直平移量  
      
    //根据平移矩阵进行仿射变换  
    cv::warpAffine(src, dst, t_mat, dst_sz);  
      
    //显示平移效果  
    cv::imshow("image", src);  
    cv::imshow("result", dst);  
      
    cv::waitKey(0);  
      
    return 0;  

    平移结果如下:

  • 相关阅读:
    CodeForces 52B Right Triangles 矩阵上的计数
    电影节
    怎样高速生成随机数
    VS2010版快捷键
    两个下拉框选择后取出这两个框的区间值
    vs操作快捷键
    输入框限制,条件是左边输入框输入的数字要小于右边输入框的值,两边输入框要为整型数字。
    DateTime.Parse
    清空文本输入框的值
    sql 随机函数newid()
  • 原文地址:https://www.cnblogs.com/Anita9002/p/9081861.html
Copyright © 2011-2022 走看看