Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

27.02.2011, 20:02

Du willst in diesem Fall keine 2D FT sondern nur 1D. Folglich sind die Matrizen auch nur Vektoren, d.h. 1xN oder Nx1 Matrizen.

Als Eingabe brauchst du ein Vektor mit allen Funktionswerten, d.h. die Höhe der Pixel für jede x-position in deinem Bild. Als ausgabe solltest du einen Vektor mit dem Spektrum bekommen. Ich hab mit der Bibliothek nie gearbeitet, daher kann ich da nur raten ;) Sieht jedoch recht ähnlich zu Matlab aus.
Also ich bin ratlos... Ich hab jegliche Konstellation versucht, doch ich bekomme nur mist raus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    /*
    * Per Furieranalyse die Frequenzanteile ermitteln
    */
    int iOptimaleWidth = getOptimalDFTSize(width);
    CvMat* in = cvCreateMat(iOptimaleWidth, 1, CV_32FC1);   // 1 Channel, 32 bit signed
    
    pCurrent = yPos;
    for(int x=0; x<iOptimaleWidth; x++, pCurrent++)  // Jede Spalte durchgehen
    {
        *((float*)(in->data.ptr + in->step*x)) = (float)*pCurrent;  // Elemente eintragen (in *pCurrent befindet sich die aktuelle Y-Koordinate)
    }
    
    Mat out;        // Das ist der Output

    dft(in, out);   // DFT ausführen
    

    // Frequenzanteile in eine Datei schreiben
    fstream f;
    f.open("lol.txt", ios::out|ios::trunc);
    for(int x=0; x<iOptimaleWidth; x++)  
    {       
        f << (float) *(out.data+x*out.step) << endl;
    }
    f.close();
    


Da sind sicherlich Fehler drin, denn das Ergebnis kann man im Anhang bestaunen xD

Ich hab schwierigkeiten mit den ganzen Zugriffen auf die Matrizen, da die Funktion cv::dft als Parameter cv::Mat verlangt. Im Internet wird jedoch ausschließlich cvMat* benutzt.

Kann zufällig jemand mich aufklären?
»F-Wölkchen« hat folgendes Bild angehängt:
  • müll.png