【问题标题】:Formula of rotating matrix/image 90 degree C++旋转矩阵/图像90度C++的公式
【发布时间】:2016-07-11 10:23:27
【问题描述】:

假设我有图像,我需要在任何方向上旋转 90 度,我就是不明白如何做到这一点。我需要使用矩阵,其中宽度 - 它是 X,高度 - 它是 Y。我已经将图像旋转 180 度,但无法计算出 90 度。

以下是示例。假设我有一个 3x4 像素的图像。宽度 = 3,高度 = 4,每个单元格中的数据量 - N = Width * Height = 3 * 4 = 12。让我们制作矩阵:

轻松遍历矩阵的公式是y*Width + x。而我们旋转180度的公式是:

N - Width + x - y * Width

所以我们有:

DataOut [y * Width + x] = DataIn [N - Width + x - y * Width]

使用这个公式我们得到:

但是我想不出旋转90度的公式。你能帮帮我吗?

【问题讨论】:

  • 您需要为此进行矩阵乘法,例如90 度旋转矩阵为[[0, -1], [1, 0]],180 度矩阵为[[-1, 0], [0, -1]]。将每个点与矩阵相乘以获得该点的旋转位置。对于任意角度a,旋转矩阵为[[cos(a), -sin(a)], [sin(a), cos(a)]]

标签: c++ image matrix


【解决方案1】:

您可以通过以下方式简单地旋转矩阵:

for(int i=0; i<cols; i++)
{
    for(int j=1; j<=rows; j++)
    {
        datOut[i][j]= datIn[rows-j][i];
    }
}

在一维数组中:

for(int i=0; i<cols; i++)
{
    for(int j=1; j<=rows; j++)
    {
        datOut[i * rows + j]= datIn[(rows-j) * cols + i];
    }
}

【讨论】:

    【解决方案2】:

    您可以轻松地将 (x + y * width) 转换为更简单的 (x, y) 表示。

    using P = point_data_type;
    P point(int x, int y){
       return DataIn[x + y * width];  // N - ...?
    }
    

    现在直角旋转只是一个坐标切换,也许是一个符号校正。

    P rotate90(int x, int y){
        return point(y, x);
    }
    

    这是左手系统中的正旋转。 如果旋转方向错误,则从 Width 中减去 x。

    【讨论】:

      猜你喜欢
      • 2020-09-04
      • 2020-04-24
      • 2013-08-04
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 2021-06-30
      • 2013-02-09
      相关资源
      最近更新 更多