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

标签 c# algorithm opencv rotation emgucv

我想使用 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/

相关文章:

java - 在对象数组中搜索字符串

algorithm - Big-O 表示法中的 O 是什么意思?

opencv:纠正这些扭曲的图像

艺术博物馆安装的 Python 脚本间歇性锁定,删除热像仪传感器读取功能似乎有效?

c++ - OpenCV:使用 cvWriteFrame 从网络摄像头写入视频时内存泄漏

c# - 使用 IIS 在本地主机上部署 Web 应用程序

c# - 在 MVVM 中阻塞 UI 线程

c# - .NET 参数传递——按引用还是按值

c# - 有没有办法检查调用者是否丢弃了 out 参数?

algorithm - AO*算法如何实现?