矩阵顺逆时针旋转90度180度

,用线性数的知识,找到基向量的位置。在通过旋转基向量来旋转矩阵。

基向量的位置如图,因为在矩阵中是以左上为起点的。所以第一维的箭头应该是向下的。

  

 

顺时针旋转90度,基向量位置如下,旋转矩阵为,所以旋转后的坐标为×=

 

逆时针旋转90度,基向量如下,旋转矩阵为,所以旋转后的坐标为×=

旋转180度,基向量如下,旋转矩阵为,所以旋转后的坐标为×=

以C语言10*10的矩阵为例,因为C语言二维数组没有负数,因此旋转后整体移了10个单位。

 1 #include<stdio.h>
 2 void print(int a[][10]){
 3     for(int i=0;i<10;i++){
 4     for(int j=0;j<10;j++){
 5         printf("%3d",a[i][j]);
 6     }
 7     printf("\n");
 8     }
 9 }
10 int main(){
11     int a[10][10];
12     int k = 0;
13     //原图像 
14     for(int i=0;i<10;i++){
15         for(int j=0;j<10;j++){
16             a[i][j] = k++;
17         }
18     } 
19     //顺时针旋转90 
20     int shun90[10][10];
21     for(int i=0;i<10;i++){
22         for(int j=0;j<10;j++){
23             shun90[j][9-i] = a[i][j];
24         }
25     }
26     //逆时针旋转90 
27     int ni90[10][10];
28     for(int i=0;i<10;i++){
29         for(int j=0;j<10;j++){
30             ni90[9-j][i] = a[i][j];
31         }
32     }
33     //旋转180 
34     int zhuan180[10][10];
35      for(int i=0;i<10;i++){
36         for(int j=0;j<10;j++){
37             zhuan180[9-i][9-j] = a[i][j];
38         }
39     }
40     printf("原图像\n\n");
41     print(a); 
42     printf("\n\n顺时针90\n\n");
43     print(shun90);
44     printf("\n\n逆时针90\n\n");
45     print(ni90);
46     printf("\n\n转180\n\n");
47     print(zhuan180);
48     
49 
50     
51     
5

 

转载于:https://www.cnblogs.com/lolybj/p/9588059.html

<think>好的,用户现在问的是如何用OpenCV让图像逆时针旋转90。之前的对话中,他们询问了如何上下翻转一个旋转矩阵,我详细介绍了使用cv::flip的方法以及相关的数学性质和注意事项。现在他们的问题转向了图像旋转,具体是逆时针90。我需要考虑他们可能的背景和使用场景。 首先,用户可能正在处理图像处理任务,比如计算机视觉项目或者图像处理应用。他们可能已经熟悉了旋转矩阵的操作,现在需要将图像旋转特定角逆时针旋转90是一个常见的需求,特别是在调整图像方向或者纠正拍摄时的方向问题。 我需要确定OpenCV中有哪些方法可以实现这个旋转。通常,旋转可以通过cv::rotate函数直接完成,或者使用cv::getRotationMatrix2D和cv::warpAffine组合来实现更灵活的控制。此外,转置和翻转的组合也是一个快速的方法,特别是对于90的倍数旋转。 考虑到用户之前的问题是关于矩阵翻转,他们可能对OpenCV的基本操作有一定了解,但可能对具体的图像旋转函数不太熟悉。因此,我需要分步骤介绍不同的方法,并比较它们的优缺点,以便用户根据自己的需求选择合适的方法。 需要注意的是,逆时针旋转90和顺时针旋转270是等价的,但用户明确要求逆时针,所以应该使用对应的参数。同时,使用转置和翻转的方法可能更高效,特别是对于大图像,因为避免了复杂的矩阵计算。 另外,用户可能关心旋转后的图像是否会裁剪或者保持完整,是否需要调整尺寸,以及旋转后的坐标变化是否会影响后续处理步骤。例如,使用cv::rotate时,图像尺寸会自动调整,而使用仿射变换可能需要手动处理填充和边界问题。 可能还需要提到旋转后的坐标原点位置,以及如何处理不同的旋转方向。例如,OpenCV的旋转矩阵默认绕图像中心旋转,但用户可能需要不同的旋转中心点,这时候需要使用getRotationMatrix2D来指定。 此外,性能也是一个考虑因素。对于实时应用,使用cv::rotate可能更快,而仿射变换更灵活但稍慢。用户可能需要根据具体情况选择。 最后,应该提供代码示例,让用户可以直接复制和测试,同时解释每个步骤的作用,确保他们理解不同参数的意义,比如cv::ROTATE_90_COUNTERCLOCKWISE。同时,提醒他们在旋转后检查图像是否正确,尤其是当处理多个旋转步骤时,避免累积误差或方向错误。</think>在 OpenCV 中,将图像逆时针旋转 90 可以通过以下两种方法实现,具体选择取决于是否需要保持图像尺寸或性能优化: --- ### **方法 1:使用 `cv::rotate()` 函数(推荐)** 这是 **最简洁高效** 的方式,直接调用 OpenCV 内置的旋转函数,适用于 90°、180°、270° 的倍数旋转。 ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("input.jpg"); if (image.empty()) { std::cerr << "Failed to load image!" << std::endl; return -1; } // 逆时针旋转90 cv::Mat rotated_image; cv::rotate(image, rotated_image, cv::ROTATE_90_COUNTERCLOCKWISE); cv::imshow("Original", image); cv::imshow("Rotated", rotated_image); cv::waitKey(0); return 0; } ``` #### **参数说明** - `cv::ROTATE_90_COUNTERCLOCKWISE`:逆时针旋转 90 。 - `cv::ROTATE_90_CLOCKWISE`:顺时针旋转 90 (等价于逆时针 270 )。 - `cv::ROTATE_180`:旋转 180 。 #### **特点** - **自动调整尺寸**:旋转后的图像宽和高会自动交换(例如 640x480 变为 480x640)。 - **无裁剪**:完整保留图像内容。 - **高效**:底层优化,适合快速处理。 --- ### **方法 2:使用仿射变换(灵活控制)** 通过 `cv::getRotationMatrix2D` 和 `cv::warpAffine` 实现,适用于 **任意角旋转**,但需要手动处理尺寸和填充。 ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("input.jpg"); if (image.empty()) return -1; // 计算旋转中心(图像中心) cv::Point2f center(image.cols / 2.0f, image.rows / 2.0f); // 逆时针旋转90的变换矩阵 cv::Mat rotation_matrix = cv::getRotationMatrix2D(center, 90, 1.0); // 计算新图像的尺寸(交换宽高) cv::Size new_size(image.rows, image.cols); // 执行仿射变换 cv::Mat rotated_image; cv::warpAffine(image, rotated_image, rotation_matrix, new_size); cv::imshow("Rotated", rotated_image); cv::waitKey(0); return 0; } ``` #### **特点** - **任意角支持**:通过修改 `cv::getRotationMatrix2D` 的角参数(如 `90`)实现任意角旋转。 - **手动尺寸调整**:需显式指定 `new_size`(交换原图的宽高)。 - **适用场景**:需要自定义旋转中心或插值方式时。 --- ### **方法 3:转置 + 翻转(高效技巧)** 对于 90° 的旋转,可以通过 **转置矩阵(Transpose)** 和 **翻转(Flip)** 的组合实现,性能极高。 ```cpp cv::Mat rotated_image; cv::transpose(image, rotated_image); // 转置(行列交换) cv::flip(rotated_image, rotated_image, 0); // 垂直翻转(逆时针90) ``` #### **数学原理** 1. **转置**:交换行和列,相当于顺时针旋转 90 并镜像。 2. **垂直翻转**:将转置后的图像上下颠倒,最终等效于逆时针旋转 90 。 --- ### **注意事项** 1. **图像通道兼容性**:上述方法支持 1 通道(灰)和 3 通道(BGR)图像。 2. **边界填充**:仿射变换 (`warpAffine`) 默认会裁剪图像,若需保留完整内容需扩展画布(通过调整 `new_size` 或添加 `cv::BORDER_CONSTANT` 参数)。 3. **性能对比**: - `cv::rotate()` 最快,推荐优先使用。 - 转置+翻转方法次之,适合嵌入式或实时系统。 - 仿射变换灵活性最高,但计算量稍大。 --- ### **示例效果** - **原始图像**(假设尺寸为 `width x height`): ``` [A B C] [D E F] [G H I] ``` - **逆时针旋转 90 **后变为 `height x width`: ``` [C F I] [B E H] [A D G] ``` --- 通过上述方法,你可以根据需求选择最适合的方式实现图像的逆时针 90 旋转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值