2016-10-12 8 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

カラーピクチャでは、すべてのピクセルがR、G、Bの3バイトで構成されています。あなたはこの事実を無視しています。 – MBo

答えて

1

長方形の長さ256のパターンには、座標オーバーフローが存在するということがあります。ここbyteにキャストで

ルック:

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

あなたがチェックし、intにfloat値を丸める必要があるようだ - それは、xとyのための範囲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引数は何ですか?

+0

私は本当にコーダーにはそれほど良いものではないので、あなたが示唆していることが何を意味するのかは分かりません。 –

+0

私はバイトにキャストしています。なぜなら、私はエラーが発生します。そしてCosとSinの中の3つの引数は、画像が何回転しているかによって角度を表すべきです。 –

+0

trigの引数。関数は度ではなく、ラジアンでなければなりません。 3ラジアンですか?あなたは何を望んでいますか? – MBo

関連する問題