利用仿射变换函数进行图像的旋转操作 只改变其旋转角度 而不进行仿射变换 旋转后的图片任然位于同原来图片的大小范围内
实现代码如下:
#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv.hpp>
using namespace cv;
using namespace std;
Mat imagerot(Mat &src, double rotangle);
int main()
{
Mat src, dst,fianlly;
Mat rotMat(2, 3, CV_32FC1);
src = imread("02.jpg");
imshow("original_iamge", src);
fianlly = imagerot(src, 45);
imshow("fianlly_result", fianlly);
waitKey(0);
return 0;
}
Mat imagerot(Mat &src, double rotangle)
{
Mat inputimage = src;
Mat outputimage = Mat::zeros(inputimage.size(), inputimage.type());//输出图像
double input_clos = inputimage.cols;
double input_rows = inputimage.rows;
Point center = Point(input_clos / 2, input_rows / 2);//旋转中心
double angle = rotangle;//旋转角度
/***************************************计算缩放比例*****************************************************/
double distance1 = sqrt(input_clos*input_clos+ input_rows* input_rows);//求取对角线长度
cout << "distance1=" <<setw(5)<<setprecision(3)<< distance1 << endl;
double distance2=min(input_clos, input_rows);
cout << "distance2=" << setw(5) <<setprecision(0) << distance2<< endl;
double scale = (distance2/ distance1); //缩放因子
cout << "distance3=" << setw(5) << setprecision(4) << scale << endl;
cout << "缩放尺度" << setw(5)<< scale << endl;
/***************************************获取变换矩阵进行变换*****************************************************/
Mat rotMat(2, 3, CV_32FC1);//定义初始变换矩阵 用于存储变化矩阵
rotMat = getRotationMatrix2D(center, angle, scale);
warpAffine(inputimage, outputimage, rotMat, outputimage.size());//图像旋转变换
//imshow("rot_iamge", outputimage);
return outputimage;
}
效果图展示