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?