2012-04-18 66 views
6

Tôi muốn vẽ một làn sóng hình sin trên một hình ảnh bằng cách sử dụng openCV. Tôi đã phát triển mã sau, nhưng đầu ra không đến như mong đợi:vẽ sóng sin bằng cách sử dụng 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); 
} 

Tôi đã xác minh các giá trị đến trong mảng y là chính xác và vẽ các giá trị y này bằng MATLAB. Các âm mưu MATLAB đang đến một làn sóng sin. Bạn có thể cho tôi biết lý do tại sao tôi không nhận được âm mưu chính xác bằng cách sử dụng mã trên.

Âm mưu đầu ra của sóng sin của tôi là như sau: bạn có thể thấy tôi chỉ nhận được một đường ngang thay vì sóng sin. Bất kỳ trợ giúp về điều này?

enter image description here

SOLVED: Sau khi làm theo câu trả lời tôi nhận được hình ảnh sau:

enter image description here Cảm ơn

Trả lời

6

Chức năng sin trả về cho bạn một giá trị [-1: 1], do đó bạn đang thiết tọa độ giữa dòng 0 và 1 trên hình ảnh của bạn. Bạn cần phải tăng biên độ của sin của bạn, chuyển giá trị của nó không và làm giảm tần số của sóng sin (như tội lỗi chấp nhận góc trong radian, vì vậy bạn sẽ vượt qua một khoảng thời gian trong 4 bước):

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

Vì vậy, , bạn sẽ có thể nhìn thấy một làn sóng sin.

+0

Hoàn hảo !! cảm ơn sự giúp đỡ nhanh chóng của bạn – geeta

+0

@geeta Bạn được chào đón! – Alex

+0

được sử dụng thay vào đó, y [(int) floor (x)] = 100 + 20 * sin (0.4 * .1 * PI * x) theo đề xuất của bạn; cốt truyện ở trên. Cảm ơn – geeta

0
  • Ngay khi bạn đặt giá trị pixel để hiển thị wave sine, thêm một khoảng bù. Vì hình ảnh là 200x200, hãy thử thêm 100,100 vào x, y. Điều này sẽ cung cấp cho bạn một làn sóng từ trung tâm trở đi
Các vấn đề liên quan