gpt4 book ai didi

c# - EmguCV 旋转算法不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:17:01 24 4
gpt4 key购买 nike

我想使用 OpenCV/EmguCV 旋转图像。我找到了一个我想要实现的旋转算法,但结果并不像我想要的那样。也许有人可以看看。

我的代码:

static void Main(string[] args)
{
Mat image = CvInvoke.Imread("C:\\Users\\Leon\\Downloads\\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++)
{
newMatrix.Data[i, j] = matrix.Data[(byte)(i * Math.Cos(3) - j * Math.Sin(3)), (byte)(i * Math.Sin(3) + j * Math.Cos(3))];
}
}

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

}
}

原图:

Vladimir Putin

我的结果:

incorrectly rotated

如果有人能指出我做错了什么,我将不胜感激! :)

最佳答案

方形长度为 256 的图案表示存在某些坐标溢出。

在此处查看转换为 byte 的情况:

 matrix.Data[(byte)(i * Math.Cos(3) - j * Math.Sin(3)), (byte)(i * Math.Sin(3) + j * Math.Cos(3))];

似乎您需要将浮点值四舍五入为 int,然后检查 - 对于 x,它是否在 0..width-10..height-1 范围内和你。

可能的伪代码:

cs = Math.Cos(angle); //calculate them once before cycle
sn = Math.Sin(angle);
...
x = (int) (i * cs - j * sn);
y = (int) (i * sn + j * cs);
if (x>=0)&&(x<width)&&(y>=0)&&(y<height)
{copy byte to new picture}

旁白:什么是 Sin 和 Cos 的 3 参数?

关于c# - EmguCV 旋转算法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com