通过transpose和flip实现图像旋转90/180/270度

本文介绍如何使用fbc_cv库中的transpose和flip函数高效地实现图像的90度倍数旋转,包括90度、180度和270度旋转,并对比了与OpenCV中对应函数的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在fbc_cv库中,提供了对图像进行任意角度旋转的函数rotate,其实内部也是调用了仿射变换函数warpAffine。如果图像仅是进行90度倍数的旋转,是没有必要用warpAffine函数的。这里通过transpose和flip函数实现对图像进行顺时针90度、180度、270度的旋转。

用fbc::transpose、fbc::flip和cv::transpose、cv::flip实现的结果是完全一致的。

通过fbc_cv库实现代码如下:

#include "test_rotate90.hpp"
#include <opencv2/opencv.hpp>
#include <transpose.hpp>
#include <flip.hpp>

int test_rotate90()
{
	cv::Mat matSrc = cv::imread("E:/GitCode/OpenCV_Test/test_images/1.jpg", 1);
	if (!matSrc.data) {
		std::cout << "read image fail" << std::endl;
		return -1;
	}

	int width = matSrc.cols;
	int height = matSrc.rows;

	fbc::Mat_<uchar, 3> mat1(height, width, matSrc.data);
	fbc::Mat_<uchar, 3> matTranspose(width, height);
	fbc::transpose(mat1, matTranspose);

	// clockwise rotation  90
	fbc::Mat_<uchar, 3> matRotate90(width, height);
	fbc::flip(matTranspose, matRotate90, 1);
	cv::Mat tmp2(width, height, CV_8UC3, matRotate90.data);
	cv::imwrite("E:/GitCode/OpenCV_Test/test_images/rotate_90.jpg", tmp2);

	// clockwise rotation 180
	fbc::Mat_<uchar, 3> matRotate180(height, width);
	fbc::flip(mat1, matRotate180, -1);
	cv::Mat tmp3(height, width, CV_8UC3, matRotate180.data);
	cv::imwrite("E:/GitCode/OpenCV_Test/test_images/rotate_180.jpg", tmp3);

	// clockwise rotation 270
	fbc::Mat_<uchar, 3> matRotate270(width, height);
	fbc::flip(matTranspose, matRotate270, 0);
	cv::Mat tmp4(matTranspose.rows, matTranspose.cols, CV_8UC3, matRotate270.data);
	cv::imwrite("E:/GitCode/OpenCV_Test/test_images/rotate_270.jpg", tmp4);

	return 0;
}

结果图像如下:

原图

顺时针旋转90度 

 顺时针旋转180度


                                                             顺时针旋转270度                                                                


GitHubhttps://github.com/fengbingchun/OpenCV_Test


### 实现图像旋转180的C++代码 要使用C++OpenCV将图片旋转180,可以通过组合`transpose()`函数`flip()`函数来完成。具体来说,先通过`transpose()`函数交换矩阵的行列,再利用`flip()`函数沿指定轴翻转图像即可[^3]。 以下是完整的示例代码: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; void rotate_180_degree(Mat &src, Mat &dst) { Mat transposed; transpose(src, transposed); // 转置图像 flip(transposed, dst, -1); // 对角线翻转(即180旋转) } int main() { // 加载图像 Mat image = imread("example.jpg"); if (image.empty()) { cout << "无法加载图像!" << endl; return -1; } Mat rotated_image; rotate_180_degree(image, rotated_image); // 显示原始图像旋转后的图像 namedWindow("原始图像", WINDOW_AUTOSIZE); imshow("原始图像", image); namedWindow("旋转180后的图像", WINDOW_AUTOSIZE); imshow("旋转180后的图像", rotated_image); waitKey(0); return 0; } ``` 上述代码定义了一个名为`rotate_180_degree`的函数,该函数接受输入图像并返回经过180旋转的结果。其中,`transpose()`负责交换图像的行列,而`flip()`则实现了最终的角调整。 另外,也可以直接使用`flip()`函数设置参数为`-1`来实现180旋转,这种方法更加简洁高效[^2]: ```cpp void rotate_180_degree_simple(Mat &src, Mat &dst) { flip(src, dst, -1); // 参数-1表示绕对角线翻转,相当于180旋转 } int main() { Mat image = imread("example.jpg"); if (image.empty()) { cout << "无法加载图像!" << endl; return -1; } Mat rotated_image; rotate_180_degree_simple(image, rotated_image); namedWindow("原始图像", WINDOW_AUTOSIZE); imshow("原始图像", image); namedWindow("简单方法旋转180后的图像", WINDOW_AUTOSIZE); imshow("简单方法旋转180后的图像", rotated_image); waitKey(0); return 0; } ``` 这两种方式都可以有效实现图像180旋转,开发者可以根据实际需求选择更合适的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值