如何在Emgu CV中实现“旋转算法”?

时间:2016-10-07 07:26:43

标签: c# algorithm opencv emgucv image-rotation

我目前正在使用C#在EmguCV中实现一个算法,这意味着我不想使用EmguCV附带的rotate函数。

我已经找到了我想要实现的算法,但我有点不知道如何实现它。主要问题是,我不知道如何指定我的Matrix的X和Y值能够进行预期的计算。

旋转算法: http://i.stack.imgur.com/hQMxF.jpg

现在我的代码看起来像这样:

static void Main(string[] args) {
        Mat image = CvInvoke.Imread("C:\\Users\\Leon\\Desktop\\a.jpg", LoadImageType.Grayscale);

        int height = image.Height;
        int width = image.Width;

        //Convert to Matrix
        Matrix<Byte> matrix = new Matrix<Byte>(image.Rows, image.Cols, image.NumberOfChannels);
        image.CopyTo(matrix);

        Matrix<Byte> newMatrix = new Matrix<Byte>(image.Rows, image.Cols, image.NumberOfChannels);
        image.CopyTo(newMatrix);

        for (int i = 0; i < matrix.Rows-1; i++)
        {
            for (int j = 0; j < matrix.Cols-1; j++)
            {

            }
        }

        CvInvoke.Imshow("abc", matrix);
        CvInvoke.WaitKey(0);

    }

但正如我所说,我对如何实现算法存有疑问。我的计划是旋转“矩阵”中的像素并将它们存储在“newMatrix”中,但我不知道如何指定矩阵的X和Y值。

也许有人可以帮助我。

编辑: 有人建议在这里回答:“How can I get and set pixel values of an EmguCV Mat image?”将是我的问题的答案。但事实并非如此。我知道我可以做Math.Cos和Math.Sin,但我不知道如何在我的Matrix中指定X和Y.访问我的矩阵中的数据时没有问题。

1 个答案:

答案 0 :(得分:0)

如果您考虑附加图片中的矩阵,请尝试针对某个点(x,y)旋转一个点(cx,cy)

class Program {
  /**
    * @param x coordinate of point want to rotate
    * @param y coordinate of point want to rotate
    * @param cx x coordinate of point you want to rotate about
    * @param cy y coordinate of point you want to rotate about
    * @return the result of rotation {x,y}
    */
  static double[] rotate(double x, double y, double cx, double cy, double angle) {
    double cos_a = Math.Cos(angle);
    double sin_a = Math.Sin(angle);

    // move to origin
    x -= cx;
    y -= cy;

    // rotate and then move back
    return new double[] {
        x*cos_a - y*sin_a + cx,
        x*sin_a + y*cos_a + cy
    };
  }


  static void Main(string[] args) {
    double x = 1;
    double y = 0;
    double a = Math.PI / 2;

    double[] r = rotate(x, y, 0, 0, a);
    Console.WriteLine("new x = " + r[0]);
    Console.WriteLine("new y = " + r[1]);
  }
}