opencv学习——图像翻转,旋转,仿射变换

一.图像翻转

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
    // 读取图像
    cv::Mat cat = cv::imread("E:\\cv_tupian\\A30F9B7070171D0A1AC9A91BAB434B39.jpg");
    if (cat.empty()) {
        std::cerr << "无法读取图像" << std::endl;
        return -1;
    }

    // 显示原图
    cv::imshow("原图", cat);

    // 水平翻转
    cv::Mat new_cat1;
    cv::flip(cat, new_cat1, 1);
    cv::imshow("水平翻转", new_cat1);

    // 上下翻转
    cv::Mat new_cat2;
    cv::flip(cat, new_cat2, 0);
    cv::imshow("上下翻转", new_cat2);

    // 上下左右翻转
    cv::Mat new_cat3;
    cv::flip(cat, new_cat3, -1);
    cv::imshow("上下左右翻转", new_cat3);

    // 等待用户输入并清理资源
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

 函数解释
cv::flip 函数

cv::flip 函数用于对图像进行水平、垂直或水平和垂直同时的翻转。其函数原型如下:

void cv::flip(InputArray src, OutputArray dst, int flipCode);
  • 参数
    • src:输入图像。
    • dst:输出图像,存储翻转后的结果。
    • flipCode:指定翻转的方向:
      • 0:垂直翻转(上下翻转)。
      • 1:水平翻转(左右翻转)。
      • -1:水平和垂直同时翻转(上下左右翻转)。

二.图像旋转

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
    // 读取图像
    cv::Mat cat = cv::imread("E:\\cv_tupian\\A30F9B7070171D0A1AC9A91BAB434B39.jpg");
    if (cat.empty()) {
        std::cerr << "无法读取图像" << std::endl;
        return -1;
    }

    // 显示原图
    cv::imshow("原图", cat);

    // 顺时针90度旋转
    cv::Mat new_cat4;
    cv::rotate(cat, new_cat4, cv::ROTATE_90_CLOCKWISE);
    cv::imshow("new_cat4", new_cat4);

    // 180度旋转
    cv::Mat new_cat5;
    cv::rotate(cat, new_cat5, cv::ROTATE_180);
    cv::imshow("new_cat5", new_cat5);

    // 逆时针90度旋转
    cv::Mat new_cat6;
    cv::rotate(cat, new_cat6, cv::ROTATE_90_COUNTERCLOCKWISE);
    cv::imshow("new_cat6", new_cat6);

    // 等待用户输入并清理资源
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

函数解释

cv::rotate 函数

cv::rotate 函数用于对图像进行旋转操作。其函数原型如下:

void cv::rotate(InputArray src, OutputArray dst, int rotateCode);
  • 参数
    • src:输入图像。
    • dst:输出图像,存储旋转后的结果。
    • rotateCode:指定旋转的角度:
      • cv::ROTATE_90_CLOCKWISE:顺时针旋转90度。
      • cv::ROTATE_180:旋转180度。
      • cv::ROTATE_90_COUNTERCLOCKWISE:逆时针旋转90度。

三.仿射变换

定义: 仿射变换是一种线性变换,它保持了图像中的平行线仍然平行,但可以改变图像的大小、旋转角度和平移位置。仿射变换可以由平移、旋转、缩放和剪切组成。

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat cat = cv::imread("E://cv_tupian//A30F9B7070171D0A1AC9A91BAB434B39.jpg");
    cv::resize(cat, cat, cv::Size(640, 480));

    cv::Mat img = cv::imread("E:\\cv_tupian\\74D63826F4F7A0B5FC5EE2029F6A38CF.png");

    
    // 仿射之平移变换
    int h = cat.rows;
    int w = cat.cols;
    cv::Mat M1 = (cv::Mat_<float>(2, 3) << 1, 0, -200, 0, 1, 200);
    cv::Mat new_cat7;
    cv::warpAffine(cat, new_cat7, M1, cv::Size(w, h));
    cv::imshow("new_cat7", new_cat7);

    // 仿射之旋转变换
    cv::Point2f center(w / 2.0f, h / 2.0f); 
    double angle = 45.0;
    double scale = 1.0;
    cv::Mat M2 = cv::getRotationMatrix2D(center, angle, scale);
    cv::Mat new_cat8;
    cv::warpAffine(cat, new_cat8, M2, cv::Size(w, h));
    cv::imshow("new_cat8", new_cat8);

    // 仿射变换(自定义变换)
    cv::Point2f src[3] = { cv::Point2f(100, 100), cv::Point2f(200, 100), cv::Point2f(200, 300) };
    cv::Point2f dst[3] = { cv::Point2f(100, 150), cv::Point2f(360, 200), cv::Point2f(280, 120) };
    cv::Mat M3 = cv::getAffineTransform(src, dst);
    cv::Mat new_cat9;
    cv::warpAffine(cat, new_cat9, M3, cv::Size(w, h));
    cv::imshow("new_cat9", new_cat9);

    // 仿射之透视变换
    cv::Point2f src1[4] = { cv::Point2f(409, 381), cv::Point2f(466, 381), cv::Point2f(97, 697), cv::Point2f(704, 698) };
    cv::Point2f dst1[4] = { cv::Point2f(200, 0), cv::Point2f(600, 0), cv::Point2f(200, 698), cv::Point2f(600, 698) };
    cv::Mat M4 = cv::getPerspectiveTransform(src1, dst1);
    cv::Mat new_img;
    cv::warpPerspective(img, new_img, M4, cv::Size(800, 698));
    cv::imshow("img", img);
    cv::imshow("new_img", new_img);

    // 等待按键事件并销毁所有窗口
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

代码解释

1.仿射之平移变换

cv::Mat M1 = (cv::Mat_<float>(2, 3) << 1, 0, -200, 0, 1, 200);
cv::Mat new_cat7;
cv::warpAffine(cat, new_cat7, M1, cv::Size(w, h));
cv::imshow("new_cat7", new_cat7);

cv::Mat M1

  • 定义:定义一个2x3的变换矩阵 M1,用于平移变换。
  • 1  0 -200
    0  1  200

  • 解释
    • 1 和 1 表示不进行缩放。
    • -200 表示向左平移200像素。
    • 200 表示向下平移200像素
  • cv::warpAffine(cat, new_cat7, M1, cv::Size(w, h));

    • 功能:使用仿射变换矩阵 M1 对图像 cat 进行变换,并将结果存储在 new_cat7 中。
    • 参数
      • cat:输入图像。
      • new_cat7:输出图像,存储变换后的结果。
      • M1:仿射变换矩阵。
      • cv::Size(w, h):输出图像的尺寸,与输入图像相同。

2. 仿射之旋转变换

cv::Point2f center(w / 2.0f, h / 2.0f); 
double angle = 45.0;
double scale = 1.0;
cv::Mat M2 = cv::getRotationMatrix2D(center, angle, scale);
cv::Mat new_cat8;
cv::warpAffine(cat, new_cat8, M2, cv::Size(w, h));
cv::imshow("new_cat8", new_cat8);
  • cv::Point2f center(w / 2.0f, h / 2.0f);

    • 功能:定义旋转中心点,即图像的中心。
    • 参数
      • w / 2.0f:图像宽度的一半。
      • h / 2.0f:图像高度的一半。
  • double angle = 45.0;

    • 功能:定义旋转角度,这里是45度。
  • double scale = 1.0;

    • 功能:定义缩放比例,这里是1.0,表示不进行缩放。
  • cv::Mat M2 = cv::getRotationMatrix2D(center, angle, scale);

    • 功能:生成一个2x3的旋转矩阵 M2
    • 参数
      • center:旋转中心点。
      • angle:旋转角度。
      • scale:缩放比例。
  • cv::warpAffine(cat, new_cat8, M2, cv::Size(w, h));

    • 功能:使用仿射变换矩阵 M2 对图像 cat 进行变换,并将结果存储在 new_cat8 中。
    • 参数
      • cat:输入图像。
      • new_cat8:输出图像,存储变换后的结果。
      • M2:仿射变换矩阵。
      • cv::Size(w, h):输出图像的尺寸,与输入图像相同。

3.自定义变换

cv::Point2f src[3] = { cv::Point2f(100, 100), cv::Point2f(200, 100), cv::Point2f(200, 300) };
cv::Point2f dst[3] = { cv::Point2f(100, 150), cv::Point2f(360, 200), cv::Point2f(280, 120) };
cv::Mat M3 = cv::getAffineTransform(src, dst);
cv::Mat new_cat9;
cv::warpAffine(cat, new_cat9, M3, cv::Size(w, h));
cv::imshow("new_cat9", new_cat9);
  • cv::Point2f src[3]

    • 功能:定义源图像中的三个点。
    • 参数
      • cv::Point2f(100, 100)
      • cv::Point2f(200, 100)
      • cv::Point2f(200, 300)
  • cv::Point2f dst[3]

    • 功能:定义目标图像中的三个点。
    • 参数
      • cv::Point2f(100, 150)
      • cv::Point2f(360, 200)
      • cv::Point2f(280, 120)
  • cv::Mat M3 = cv::getAffineTransform(src, dst);

    • 功能:生成一个2x3的仿射变换矩阵 M3,用于将源图像中的三个点映射到目标图像中的三个点。
    • 参数
      • src:源图像中的三个点。
      • dst:目标图像中的三个点。
  • cv::warpAffine(cat, new_cat9, M3, cv::Size(w, h));

    • 功能:使用仿射变换矩阵 M3 对图像 cat 进行变换,并将结果存储在 new_cat9 中。
    • 参数
      • cat:输入图像。
      • new_cat9:输出图像,存储变换后的结果。
      • M3:仿射变换矩阵。
      • cv::Size(w, h):输出图像的尺寸,与输入图像相同。

二. 透视变换

定义: 透视变换是一种更复杂的变换,它可以模拟相机从不同角度拍摄图像的效果。透视变换可以改变图像的形状,使得平行线在变换后可能不再平行。透视变换通常用于图像校正、3D重建等场景。

cv::Point2f src1[4] = { cv::Point2f(409, 381), cv::Point2f(466, 381), cv::Point2f(97, 697), cv::Point2f(704, 698) };
cv::Point2f dst1[4] = { cv::Point2f(200, 0), cv::Point2f(600, 0), cv::Point2f(200, 698), cv::Point2f(600, 698) };
cv::Mat M4 = cv::getPerspectiveTransform(src1, dst1);
cv::Mat new_img;
cv::warpPerspective(img, new_img, M4, cv::Size(800, 698));
cv::imshow("img", img);
cv::imshow("new_img", new_img);
  • cv::Point2f src1[4]

    • 功能:定义源图像中的四个点。
    • 参数
      • cv::Point2f(409, 381)
      • cv::Point2f(466, 381)
      • cv::Point2f(97, 697)
      • cv::Point2f(704, 698)
  • cv::Point2f dst1[4]

    • 功能:定义目标图像中的四个点。 0 - 参数
      • cv::Point2f(200, 0)
      • cv::Point2f(600, 0)
      • cv::Point2f(200, 698)
      • cv::Point2f(600, 698)
  • cv::Mat M4 = cv::getPerspectiveTransform(src1, dst1);

    • 功能:生成一个3x3的透视变换矩阵 M4,用于将源图像中的四个点映射到目标图像中的四个点。
    • 参数
      • src1:源图像中的四个点。
      • dst1:目标图像中的四个点。
  • cv::Mat new_img;

    • 功能:定义一个新的 cv::Mat 对象 new_img,用于存储透视变换后的图像。
  • cv::warpPerspective(img, new_img, M4, cv::Size(800, 698));

    • 功能:使用透视变换矩阵 M4 对图像 img 进行变换,并将结果存储在 new_img 中。
    • 参数
      • img:输入图像。
      • new_img:输出图像,存储变换后的结果。
      • M4:透视变换矩阵。
      • cv::Size(800, 698):输出图像的尺寸。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值