2016-10-12 5 views
0

Я хочу повернуть изображение, используя OpenCV/EmguCV. Я нашел алгоритм вращения, который я хочу реализовать, но результат не совсем такой, какой я хочу. Может быть, кто-то может посмотреть.Алгоритм вращения 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

Если кто-то может указать на то, что я делаю неправильно, Я был бы очень благодарен! :)

+0

Не можете использовать метод транспонирования? –

+0

Это упражнение, которое я должен сделать для курса в моем университете, поэтому мне нужно реализовать алгоритм с нуля, и мне не разрешено использовать встроенные функции/методы. –

+0

В цветном изображении каждый пиксель состоит из 3 байтов R, G, B. Вы игнорируете этот факт. – MBo

ответ

1

Образец с квадратной длиной 256 говорит о том, что существует некоторое переполнение координат.

Посмотрите на кастинг в байты здесь:

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

Кажется, вам нужно округлить значения с плавающей точкой в ​​целое, а затем проверить - если он лежит в диапазоне 0..width-1 или 0..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} 

Помимо вопроса: что 3 аргумент Sin и Cos?

+0

Я действительно не очень хорош кодер, поэтому я не знаю, что вы подразумеваете под тем, что вы предлагаете. –

+0

Я кастую в байт, потому что я получаю сообщение об ошибке, если я этого не делаю. И аргументы внутри Cos и Sin, что означает 3, должны представлять угол поворота изображения. –

+0

Аргумент тригг. функция должна быть в радианах, а не в градусах. Есть 3 радиана - что вы хотели? – MBo

 Смежные вопросы

  • Нет связанных вопросов^_^