2012-04-18 2 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); 
} 

내가 값이 Y 배열에서 오는 검증 정확했고, MATLAB을 사용하여 이러한 y 값을 꾸몄다. MATLAB 플롯이 사인파가되고 있습니다. 왜 위의 코드를 사용하여 올바른 줄거리를 얻지 못하고 있는지 말해 줄 수 있습니까?

사인파의 출력 플롯은 다음과 같습니다. 사인파 대신 수평선이 표시되는 것을 볼 수 있습니다. 이것에 관한 도움이 필요하십니까?

enter image description here

해결했다, 그래서 당신은 설정과 같습니다 sin 기능은 당신에게 값 [1 -1]을 반환

답변

6

enter image description here 감사 : 대답을 수행 한 후 나는 다음과 같은 이미지를 가지고 이미지의 0과 1 행 사이의 좌표입니다.

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

그래서 : 당신은 제로 값의 이동 및 사인파의 주파수를 감소 (죄가 라디안 각도를 받아 같은, 그래서 당신은 4 단계의 기간을 통과 할 것이다), 당신의 sin의 진폭을 증가시킬 필요가 , 당신은 사인파를 볼 수있을 것입니다.

+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을 더하십시오. 센터에서 이후로 웨이브를 줄 것입니다
관련 문제