仿射变换对应着五种变换:平移,缩放,旋转,翻转,错切
#include<opencv2/opencv.hpp>
#include<iostream>
#include <vector>
int main(int argc, char** argv) {
cv::Mat I = cv::imread("D:/bb/tu/ma.png");
cv::Mat dst;
//设置原图3个变换顶点
cv::Point2f AffinePoints0[3] = { cv::Point2f(10, 10), cv::Point2f(10, 300), cv::Point2f(300, 10) };
//仿射变换是根据三个点来变换的
//设置目标图像3个变换顶点
cv::Point2f AffinePoints1[3] = { cv::Point2f(50, 50), cv::Point2f(50, 350), cv::Point2f(250, 10) };
cv::Mat Trans = getAffineTransform(AffinePoints0, AffinePoints1);//计算变换矩阵
//参数1:原图像的3个点
//参数2:目标图像的3个点
warpAffine(I, dst, Trans, cv::Size(I.cols, I.rows));//矩阵仿射变换
//参数1:变换前图像
//参数2:变换后图像
//参数3:变换矩阵,用另一个函数getAffineTransform()计算
//参数4:输出图像大小
//参数5:参数int flags=INTER_LINEAR:设置插值方式,默认方式为线性插值,看下图
imshow("src", I);
imshow("dst", dst);
cv::waitKey(0);
return 0;
}
getRotationMatrix2D旋转
#include<opencv2/opencv.hpp>
#include<iostream>
int main(int argc, char** argv) {
cv::Mat src = cv::imread("D:/bb/tu/1.jpg");
cv::imshow("src", src);
int rows = src.rows;
int cols = src.cols;
cv::Point2f center = cv::Point2f(rows / 2, cols / 2);
cv::Mat Trans,dst;
double angle = 90.0;
double scale = 0.8;
Trans =getRotationMatrix2D(center, angle, scale);//计算变换矩阵--旋转
//参数1:旋转的中心点
//参数2:旋转角度,正号为逆时针,负号为顺时针
//参数3:旋转后图像相比原来的缩放比例,1为等比例缩放
warpAffine(src, dst, Trans, cv::Size(src.cols, src.rows));//矩阵仿射变换
cv::imshow("dst", dst);
cv::waitKey(0);
return 0;
}