2012-04-18 20 views
6

openCVを使って画像上に正弦波を描きたい。私は、次のコードを開発したが、予想通りの出力が来ていない。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); 
} 

Iをyアレイに来ることは正しい値を検証し、MATLABを使用して、これらのyの値をプロットしています。 MATLABプロットは正弦波になります。上記のコードを使って正しいプロットが得られない理由を教えてください。

正弦波の出力プロットは次のようになります。正弦波ではなく水平線を取得しているのが分かります。これに関する助け?答えは以下の後、私は、次の画像を得た::、ので、あなたが設定されています

enter image description here おかげ

答えて

6

sin機能は、あなたに値[1 -1]を返す解決しよう

enter image description here

画像上の0行目と1行目の間の座標です。 あなたは(あなたが4つのステップで期間を渡しますので、罪がラジアンで角度を受け入れるように)、それはゼロの値だシフトし、正弦波の周波数を減らし、あなたのsinの振幅を大きくする必要があります。

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

ので、あなたは正弦波を見ることができます。

+0

完璧!あなたのクイックヘルプに感謝 – geeta

+0

@geetaようこそ! – Alex

+0

は、あなたの提案に続いてy [(int)floor(x)] = 100 + 20 * sin(0.4 * .1 * PI * x)を使用しました。プロットは上です。ありがとう – geeta

0
  • 正弦波を示すようにピクセル値を設定する場所で、オフセットを追加します。画像は200x200なので、x、yに100,100を加えてみてください。これで中心から波が届くはずです
関連する問題