我目前正在使用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.访问我的矩阵中的数据时没有问题。
答案 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]);
}
}