OpenCV几何图像变换(9)仿射变换函数warpAffine()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

函数是应用一个仿射变换到图像上。

warpAffine 函数使用指定的矩阵对源图像进行仿射变换:
dst ( x , y ) = src ( M 11 x + M 12 y + M 13 , M 21 x + M 22 y + M 23 ) \texttt{dst} (x,y) = \texttt{src} ( \texttt{M} _{11} x + \texttt{M} _{12} y + \texttt{M} _{13}, \texttt{M} _{21} x + \texttt{M} _{22} y + \texttt{M} _{23}) dst(x,y)=src(M11x+M12y+M13,M21x+M22y+M23)

当设置了标志 WARP_INVERSE_MAP 时。否则,先使用 invertAffineTransform 函数对变换进行反转,然后将反转后的矩阵放入上述公式中代替 M。该函数不能原地操作

warpAffine()函数用于应用仿射变换到图像上。仿射变换是一种线性变换,它可以包括旋转、缩放、平移和错切(shear)等操作。

函数原型

cpp 复制代码
void cv::warpAffine	
(
	InputArray 	src,
	OutputArray 	dst,
	InputArray 	M,
	Size 	dsize,
	int 	flags = INTER_LINEAR,
	int 	borderMode = BORDER_CONSTANT,
	const Scalar & 	borderValue = Scalar() 
)		

参数

  • 参数src 输入图像。
  • 参数dst 输出图像,它具有 dsize 的大小和与 src 相同的类型。
  • 参数M 2×3的变换矩阵。
  • 参数dsize 输出图像的大小。
  • 参数flags 插值方法的组合(参见 InterpolationFlags)和可选标志 WARP_INVERSE_MAP,该标志表示 M 是逆变换(dst→src)。
  • 参数borderMode 像素外推方法(参见 BorderTypes);当 borderMode=BORDER_TRANSPARENT 时,意味着目标图像中对应于源图像中的"异常值"的像素不会被函数修改。
  • 参数borderValue 在存在常数边界时所使用的值;默认情况下,它是 0。

代码示例

cpp 复制代码
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;

int main( int argc, char** argv )
{
    // 读取图像
    Mat image = imread( "/media/dingxin/data/study/OpenCV/sources/images/fruit_small.jpg", IMREAD_COLOR );

    if ( image.empty() )
    {
        std::cerr << "Error: Could not open or find the image." << std::endl;
        return -1;
    }

     // 获取图像的尺寸
    int cols = image.cols;
    int rows = image.rows;
    
    // 计算旋转中心点
    Point2f center(cols / 2.0, rows / 2.0);
    
    // 设置旋转角度和缩放因子
    double angle = 45.0; // 旋转角度
    double scale = 1.0;  // 缩放因子
    
    // 计算旋转矩阵
    Mat rotationMatrix = getRotationMatrix2D(center, angle, scale);
    
    // 获取输出图像的大小
    Size dsize(cols, rows);
    
    // 创建输出图像
    Mat rotatedImage;
    
    // 应用仿射变换
    warpAffine(image, rotatedImage, rotationMatrix, dsize, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));


    // ===错切===

    // 设置错切系数
    double shearX = 0.5; // 水平方向错切系数
    double shearY = 0.5; // 垂直方向错切系数
    
    // 计算错切矩阵
    Mat shearMatrix = (Mat_<double>(2,3) << 1, shearX, 0, shearY, 1, 0);
    
    // 创建输出图像
    Mat shearedImage;
    
    // 设置输出图像的大小
    Size dsize2(image.cols, image.rows);
    
    // 应用仿射变换
    warpAffine(image, shearedImage, shearMatrix, dsize2, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));

    // 平移

       // 设置平移距离
    int dx = 100; // 水平方向平移距离
    int dy = 50;  // 垂直方向平移距离
    
    // 计算平移矩阵
    Mat translationMatrix = (Mat_<double>(2,3) << 1, 0, dx, 0, 1, dy);
    
    // 创建输出图像
    Mat translatedImage;
    
    // 设置输出图像的大小
    Size dsize3(image.cols, image.rows);
    
    // 应用仿射变换
    warpAffine(image, translatedImage, translationMatrix, dsize3, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));

    // 缩放
      // 设置缩放比例
    double scaleX = 0.5; // 水平方向缩放比例
    double scaleY = 0.5; // 垂直方向缩放比例
    
    // 计算缩放矩阵
    Mat scalingMatrix = (Mat_<double>(2,3) << scaleX, 0, 0, 0, scaleY, 0);
    
    // 创建输出图像
    Mat scaledImage;
    
    // 设置输出图像的大小
    Size dsize4(image.cols * scaleX, image.rows * scaleY);
    
    // 应用仿射变换
    warpAffine(image, scaledImage, scalingMatrix, dsize4, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
    
    
    // 显示结果
   
    imshow("原始图像", image);
    imshow("旋转图像", rotatedImage);
    imshow("错切图像", shearedImage);
    imshow("平移图像", translatedImage);
    imshow("缩放图像", scaledImage);
    
    waitKey(0);

    return 0;
}

运行结果

相关推荐
weixin_437497771 小时前
读书笔记:Context Engineering 2.0 (上)
人工智能·nlp
喝拿铁写前端1 小时前
前端开发者使用 AI 的能力层级——从表面使用到工程化能力的真正分水岭
前端·人工智能·程序员
goodfat1 小时前
Win11如何关闭自动更新 Win11暂停系统更新的设置方法【教程】
人工智能·禁止windows更新·win11优化工具
北京领雁科技1 小时前
领雁科技反洗钱案例白皮书暨人工智能在反洗钱系统中的深度应用
人工智能·科技·安全
落叶,听雪1 小时前
河南建站系统哪个好
大数据·人工智能·python
清月电子2 小时前
杰理AC109N系列AC1082 AC1074 AC1090 芯片停产替代及资料说明
人工智能·单片机·嵌入式硬件·物联网
Dev7z2 小时前
非线性MPC在自动驾驶路径跟踪与避障控制中的应用及Matlab实现
人工智能·matlab·自动驾驶
七月shi人2 小时前
AI浪潮下,前端路在何方
前端·人工智能·ai编程
橙汁味的风2 小时前
1隐马尔科夫模型HMM与条件随机场CRF
人工智能·深度学习·机器学习
itwangyang5202 小时前
AIDD-人工智能药物设计-AI 制药编码之战:预测癌症反应,选对方法是关键
人工智能