7

openCVを使って画像に正弦波を描きたいです。次のコードを作成しましたが、期待どおりの出力が得られません。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"
void main()
{ 
double y[100]; 
      float x; 


  for(x=0;x<100;x++)
  {
      y[(int)floor(x)]=sin(x);

  }

  IplImage *grf = cvCreateImage( cvSize( 200, 200), IPL_DEPTH_8U, 1 );


  for(int x=0;x<100;x++)
  {
  cvLine(grf ,                         /* the dest image */
          cvPoint(x, y[x]),  /* start point */

           cvPoint(x+1, y[x+1]),            /* end point */
           CV_RGB(255, 0, 0),      /* the color; green */
           2, 4, 0);                    /* thickness, line type, shift */

  }


  cvNamedWindow("img", CV_WINDOW_AUTOSIZE);
    cvShowImage("img", grf);
    cvWaitKey(0);
    cvDestroyWindow("img");
    cvReleaseImage(&grf);
}

y 配列の値が正しいことを確認し、MATLAB を使用してこれらの y 値をプロットしました。MATLAB プロットは正弦波になっています。上記のコードを使用して正しいプロットが得られない理由を教えてください。

正弦波の出力プロットは次のようになります。正弦波の代わりに水平線が表示されていることがわかります。これに関するヘルプはありますか?

ここに画像の説明を入力

解決済み:答えをたどった後、次の画像が得られました:

ここに画像の説明を入力 ありがとう

4

2 に答える 2

8

このsin関数は値[-1:1]を返すため、画像の0行目と1行目の間に座標を設定しています。の振幅を増やしsin、ゼロ値をシフトし、正弦波の周波数を下げる必要があります(sinはラジアン単位の角度を受け入れるため、4ステップで周期を通過します)。

y[(int)floor(x)]=10 + 10*sin(2*.1*PI*x);

だから、あなたは正弦波を見ることができるでしょう。

于 2012-04-18T13:07:57.263 に答える
0
  • 正弦波を表示するようにピクセル値を設定した場所に、オフセットを追加します。画像は200x200なので、x,yに100,100を足してみてください。これにより、中心から以降の波が得られるはずです
于 2012-04-18T13:14:57.170 に答える