OpenCV 4.5 C++版 将矩阵顺时针旋转 90 度

Posted xufulin2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 4.5 C++版 将矩阵顺时针旋转 90 度相关的知识,希望对你有一定的参考价值。

demo

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;


Mat_<char> rotate90(Mat_<char> originMatrix)
{
    // 原本 i row j col 的,顺时针旋转90度之后变成 j row i col的
    Mat_<char> outputMatrix = Mat::zeros(originMatrix.cols, originMatrix.rows, CV_8SC1);

    for(int y = 0; y < originMatrix.rows; ++y)
    {
        for(int x = 0; x < originMatrix.cols; ++x)
        {
            outputMatrix.at<char>(x, originMatrix.rows -1 -y) = originMatrix.at<char>(y, x);
        }
    }
    return outputMatrix;
}

void printMatrix(Mat_<char> inputMatrix)
{
    for(int y = 0; y < inputMatrix.rows; ++y)
    {
        for(int x = 0; x < inputMatrix.cols; ++x)
        {
            cout << (int)inputMatrix.at<char>(y, x) << " ";
        }
        cout << endl;
    }
}

int main(void)
{
    Mat_<char> diyMatrix = (
        Mat_<char>(3, 4) << -1, 0, 1, 7,
                            -2, 0, 2, 8,
                            -1, 0, 1, 9);

    // printMatrix(diyMatrix);
    cout << diyMatrix << endl;

    diyMatrix = rotate90(diyMatrix);

    cout << diyMatrix << endl;

    return 0;
}

result

[ -1,   0,   1,   7;
  -2,   0,   2,   8;
  -1,   0,   1,   9]
[ -1,  -2,  -1;     
   0,   0,   0;     
   1,   2,   1;     
   9,   8,   7]  

解读

没啥好说的。认真想想,我们一般编号从 1 开始的,但是C/C++是从 0 开始的。
数学上,原本矩阵的 第 i 行 j 列的,旋转后变成 j 行 (n - i + 1) 列(i 和 j 都从 1 开始编号),
程序上,原本矩阵的 第 i 行 j 列的,旋转后变成 j 行 (n - 1 - i ) 列(i 和 j 都从 0 开始编号)。

认真想想,所以我们并不能让下标从 1 开始算,否则分析起来貌似没有意义。

以上是关于OpenCV 4.5 C++版 将矩阵顺时针旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章

Leecode-48:旋转图像(矩阵顺时针旋转90度)

求顺时针旋转变换对应的矩阵

顺时针旋转矩阵

顺时针旋转矩阵

方阵原地顺时针旋转90度

矩阵中旋转变换公式是指逆时针旋转还是顺时针 有啥不同啥意思