小工具知识网

当前位置: 首页 > 行业知识 > 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

行业知识

【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

2026-11-02 09:22:14 来源:互联网转载

仿射变���是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移、缩放、旋转等操作。通过原理、函数和示例进行解析,帮助大家理解和使用。

下面我们将依次实现平移、旋转、缩放和仿射变换等功能,使用C++语言和OpenCV库。

目录

  • 原理和函数
    • 原理
    • warpAffine()函数详解
    • 示例
      • 平移
        • 原理
        • 运行示例
        • 缩放
          • 原理
          • 缩小示例
          • 放大示例
          • 旋转
            • 原理
            • 顺时针示例
            • 逆时针示例
            • 总结

              原理和函数

              原理

              由于矩阵A的最后一行为(0,0,1),所以认为A是仿射变换矩阵,变换类型主要包括平移、缩放和旋转。

              warpAffine()函数详解

              warpAffine() 是 OpenCV 库中的一个函数,用于进行二维仿射变换。该函数将输入图像映射到输出图像,应用仿射变换。

              函数原型如下:

              void cv::warpAffine(InputArray src, OutputArray dst, InputArray mat, Size dsize = Size(), int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, Scalar borderValue = Scalar());参数详解:src:输入图像,必须是单通道或三通道的8位或32位浮点型图像。dst:输出图像,其大小和类型与输入图像相同。mat:2x3的变换矩阵。dsize:输出图像的大小,如果这个参数为 Size() ,则输出图像的大小将与输入图像相同。flags:用于指定插值的方法,默认为线性插值。可用的选项有 INTER_NEAREST, INTER_LINEAR, INTER_CUBIC 等。borderMode:用于指定如何处理输出图像边缘的像素,默认为常量填充模式。可用的选项有 BORDER_CONSTANT, BORDER_REPLICATE, BORDER_WRAP 等。borderValue:用于指定填充的边界值,默认为0。

              这个函数使用仿射变换来将输入图像映射到输出图像。仿射变换包括旋转、缩放、平移等操作,但不包括扭曲和剪切。这个函数非常有用,特别是在需要将图像映射到另一个大小或以特定方式旋转或倾斜图像时。

              示例

              平移

              原理

              平移变换可以用一个3x3的变换矩阵来表示,其中第一行和第二行表示原始图像的行向量和列向量,第三行表示变换后的行向量和列向量,和原理部分类似,但有些版本只需要设置一个2x3的变换矩阵即可,可以省略第三行。在本例中,即定义的是2x3的变换矩阵,我们将原始图像向右移动100个像素,向下移动300个像素。其中,数值为正,则向正方向移,数值为负,则向反向相移。

              如上述矩阵转换矩阵,只需要设置第一行的第三个元素tx和第二行第三列的ty即可,体现在2行3列的矩阵中如下面运行示例中的100和300所示。

              运行示例

              #include #include using namespace cv;using namespace std;int main() {    Mat src = imread("ceshi.jpg");    if (src.empty()) {        cout     Mat src = imread("ceshi.jpg");    if (src.empty()) {        cout     Mat src = imread("ceshi.jpg");    if (src.empty()) {        cout     Mat src = imread("ceshi.jpg");    if (src.empty()) {        cout 

上一篇:r耳朵的英文怎么读?

下一篇:域服务器怎么更改域名?