一.图像翻转
#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
:缩放比例。
- 功能:生成一个2x3的旋转矩阵
-
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
:目标图像中的三个点。
- 功能:生成一个2x3的仿射变换矩阵
-
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)
- 功能:定义目标图像中的四个点。 0 - 参数:
-
cv::Mat M4 = cv::getPerspectiveTransform(src1, dst1);
:- 功能:生成一个3x3的透视变换矩阵
M4
,用于将源图像中的四个点映射到目标图像中的四个点。 - 参数:
src1
:源图像中的四个点。dst1
:目标图像中的四个点。
- 功能:生成一个3x3的透视变换矩阵
-
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)
:输出图像的尺寸。
- 功能:使用透视变换矩阵