3

画像をグレースケールに変換し、後で画像を回転させるopencvを使用して、このプログラムをc ++で作成しようとしましたが、得られる出力はすべてめちゃくちゃです。

私は解決策を探し、どこでも助けを求めてきましたが、何が間違っていたのかを見つけることができませんでした。

コード: http://pastebin.com/FSJKyaeU

また、これは私が得た出力の写真です http://i.imgur.com/qpYm1.jpg

4

2 に答える 2

2

置き換えてください:

Mat imRotate(im.cols * 2, im.rows * 2, im.type());

これを使用するには:

  int size = static_cast<int>(sqrt(im.cols * im.cols/4 + im.rows * im.rows/4) * 2) + 1;
  Mat imRotate(size, size , im.type());

次に、FuncRotate を更新します。次のようなことをする必要があると思います:

    void FuncRotate(Mat im, Mat imRotate, int q, int x, int y, int rows, int columns) 
    {
      double radians = (q * 3.1415)/180; // or try use M_PI instead of 3.1415
      double cosr = cos(radians);
      double sinr = sin(radians);

      for(int i=0; i<columns; i++) //columns of the original image
      {
         for(int j=0; j<rows; j++) //rows of the original image
         {
            int NewXPixel = imRotate.cols/2 + ((i-x) * cosr) - ((j-y) * sinr);
            int NewYPixel = imRotate.rows/2 + ((i-x) * sinr) + ((j-y) * cosr);
            if(NewXPixel < 0 || NewYPixel < 0 || NewXPixel >= imRotate.cols || NewYPixel >= imRotate.rows)
    continue;
  imRotate.at<unsigned char>(NewYPixel,NewXPixel) = im.at<unsigned char>(j,i);
         }
      }
    }
于 2012-10-21T18:54:28.110 に答える
0

少なくともこの行には何か問題があると思います:

imRotate.at<unsigned char>(i,j) = im.at<unsigned char>(NewXPixel,NewYPixel);

... iandjは元の画像をループすることになっているからですよね?

おそらく、次のような意味でした:

imRotate.at<unsigned char>(NewXPixel,NewYPixel) = im.at<unsigned char>(i,j);

また、xyは では使用されませんFuncRotate

imRotateさらに、ゼロに初期化する必要があると思います。

于 2012-10-21T17:53:35.397 に答える