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

demo

#include
#include
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 开始算,否则分析起来貌似没有意义。

你可能感兴趣的:(小demo,opencv,c++,矩阵)