opencv 图像旋转


一、翻转(90 / 180 / 270)


进行旋转 90、180、270 度时,需要用到 transpose 和 flip 函数,


1、transpose

函数声明:

void transpose(InputArray src, OutputArray dst);
transpose 函数用来实现矩阵转置,输出为转置后的矩阵。

相关代码:

Mat src, dst;
src = imread("C:\\Users\\Ru\\Desktop\\cat.jpg");
transpose(src, dst);

转置前:
在这里插入图片描述

转置后,所有坐标点由 (x,y) 转换为 (y,x):
在这里插入图片描述

2、flip

函数声明:

void flip(InputArray src, OutputArray dst, int flipCode);
flip 函数用来进行图像翻转,flipCode >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转。

顺时针旋转 90 度(向右旋转 90 度):

Mat src = imread("C:\\Users\\Ru\\Desktop\\cat.jpg");
transpose(src, src);
flip(src, src, 1);

在这里插入图片描述


顺时针旋转 180 度(水平翻转 + 垂直翻转):

Mat src = imread("C:\\Users\\Ru\\Desktop\\cat.jpg");
flip(src, src , 0);
flip(src, src, 1);

或者:
Mat src = imread("C:\\Users\\Ru\\Desktop\\cat.jpg");
flip(src, src, -1);

在这里插入图片描述

顺时针旋转 270 度(向左旋转 90 度):

Mat  src = imread("C:\\Users\\Ru\\Desktop\\cat.jpg");
transpose(src, src);
flip(src, src, 0);

在这里插入图片描述


二、翻转( 任意角度 )


代码示例:

项目组其他小伙伴写的,我抄袭一下~

void rotateMax(cv::Mat src, cv::Mat& dst)
{
    // 逆时针旋转角度
	double angle = 45;

	cv::Size src_sz = src.size();
	cv::Size dst_sz(src_sz.width, src_sz.height);

    // 设定旋转中心
	cv::Point center = cv::Point(src.cols / 2, src.rows / 2);
    // 获得仿射变换矩阵
	cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
	
	cv::Rect bbox = cv::RotatedRect(center, src.size(), angle).boundingRect();

	rot_mat.at<double>(0, 2) += bbox.width / 2.0 - center.x;
	rot_mat.at<double>(1, 2) += bbox.height / 2.0 - center.y;

	cv::warpAffine(src, dst, rot_mat, bbox.size());
}

效果图:
在这里插入图片描述

建议:

如果要使得添加的背景为白色,可以反色一下。

猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/102807247