2012-04-18 18 views
6

Voglio disegnare un'onda sinusoidale su un'immagine utilizzando openCV. Ho sviluppato il seguente codice, ma l'uscita non è venuta come previsto:disegno onda sinusoidale con 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); 
} 

ho verificato i valori provenienti matrice Y è corretto, e tramato questi valori y utilizzando MATLAB. La trama di MATLAB sta arrivando sinusoidale. Puoi dirmi perché non sto ottenendo la trama corretta usando il codice sopra.

Il grafico di uscita dell'onda sinusoidale è il seguente: è possibile vedere che sto ottenendo una linea orizzontale anziché l'onda sinusoidale. Qualche aiuto per quanto riguarda questo?

enter image description here

risolto: Dopo aver seguito la risposta che ho ricevuto la seguente immagine:

enter image description here Grazie

risposta

6

La funzione sin si restituisce un valore [-1: 1], in tal modo si sta impostando coordinate tra la linea 0 e 1 sull'immagine. È necessario aumentare l'ampiezza della vostra sin, spostare il suo valore zero e ridurre una frequenza dell'onda sinusoidale (come peccato accetta angolo in radianti, quindi dovrete passare un periodo in 4 passi):

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

Così , sarai in grado di vedere un'onda sinusoidale.

+0

Perfetto !! grazie per il tuo aiuto rapido – geeta

+0

@geeta Sei il benvenuto! – Alex

+0

ha usato invece, y [(int) floor (x)] = 100 + 20 * sin (0.4 * .1 * PI * x) seguendo i tuoi suggerimenti; la trama è sopra. Grazie – geeta

0
  • Proprio dove si imposta il valore del pixel per mostrare l'onda sinusoidale, aggiungere un offset. Poiché l'immagine è 200x200, prova ad aggiungere 100.100 a x, y. Questo dovrebbe darti un'onda dal centro in poi