项目功能实现:对一张图像进行旋转完全显示,且空白区域用绿色填充
按照之前的博文结构来,这里就不在赘述了
一、头文件
rotating.h
#pragma once#include<opencv2/opencv.hpp>using namespace cv;class ROTATING {
public:void rotating(Mat & image);
};#pragma once
二、函数实现
rotating.cpp
对于一张图片进行旋转,主要依靠于一个矩阵就可以实现
OpenCV中所需的矩阵为M,是一个[2,3]的矩阵,最后一列表示向x和y轴方向移动的信息
OpenCV提供API可以进行构建M矩阵
M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);
参数一:图片的中心位置
参数二:旋转的角度
参数三:是否在旋转过程中进行缩放,1.0表示保存原始尺寸不进行缩放
得到M之后,根据M的结构
double cos = abs(M.at<double>(0, 0));
,通过(0,0)获取得到cosθ
double sin = abs(M.at<double>(0, 1));
,通过(0,1)获取得到sinθ
一张图片旋转之后必须通过更大的区域才能将其完全展示下来,故旋转之后展示的大小需要变大,要不然没法把旋转后的图片完全展示出来
最终求得新的窗口高宽
int new_w = w * cos + h * sin;
int new_h = w * sin + h * cos;
需要对原先的M的后一列赋值,表示进行x和y方向的移动,这样才能将图片完全给展示出来,在原来的基础上移动一半即可
M.at<double>(0, 2) += (new_w / 2 - w / 2);
M.at<double>(1, 2) += (new_h / 2 - h / 2);
warpAffine(image, result, M, Size(new_w,new_h), INTER_LINEAR, 0, Scalar(0, 255, 0));
参数一:处理的图片对象
参数二:输出的图片对象
参数三:仿射变换矩阵M
参数四:输出图像的尺寸大小
参数五:插值方法
参数六:像素外推法,默认为0即可
参数七:其他空白区域填充的颜色
#include"rotating.h"
#include<iostream>
#include<opencv2/opencv.hpp>void ROTATING::rotating(Mat& image) {Mat result, M;//M是一个2*3的变换矩阵int w = image.cols;int h = image.rows;M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);double cos = abs(M.at<double>(0, 0));double sin = abs(M.at<double>(0, 1));int new_w = w * cos + h * sin;int new_h = w * sin + h * cos;M.at<double>(0, 2) += (new_w / 2 - w / 2);M.at<double>(1, 2) += (new_h / 2 - h / 2);warpAffine(image, result, M, Size(new_w,new_h), INTER_LINEAR, 0, Scalar(0, 255, 0));imshow("rotating",result);
}
三、主函数
yy_main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include "rotating.h"using namespace cv;
using namespace std;int main(int argc, char** argv) {Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);if (src.empty()) {printf("load image is false...\n");return -1;}namedWindow("yanyu", WINDOW_FREERATIO);imshow("yanyu", src);ROTATING yy;yy.rotating(src);waitKey(0);destroyAllWindows();return 0;
}
项目结构如下:
运行效果如下: