2016-10-12 5 views
0

OpenCV/EmguCV를 사용하여 이미지를 회전하고 싶습니다. 구현하고자하는 회전 알고리즘을 찾았지만 원하는 결과가 아니 었습니다. 어쩌면 누군가가 볼 수 있습니다.EmguCV Rotation 알고리즘이 작동하지 않습니다.

내 코드 :

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))]; 

하면 확인 후, int로 부동 소수점 값을 반올림해야 할 것 같다 - 그것은 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

바이트로 전송 중입니다. 이유가 없으면 오류가 발생합니다. 그리고 3을 의미하는 Cos와 Sin의 주장은 이미지가 회전되는 각도에 의해 표현되어야합니다. –

+0

trig의 인수입니다. 함수는 각도가 아닌 라디안이어야합니다. 3 라디안입니까? 당신이 원하는 것은 무엇입니까? – MBo