Es gibt ein paar Probleme kann ich
- Ihre binSize Berechnung ist falsch
- Ihr Binning-Algorithmus zu sehen ist einseitig, und sollte zweiseitig
- Sie Inkrementieren nicht die richtige bin, wenn Sie eine Übereinstimmung finden
1. binsize Berechnung
bin size = your range/number of bins
2. zweiseitig Binning
if (src_pic_point[x] <= z*binSize)
Sie benötigen einen zweiseitigen Wertebereich, keine einseitige Ungleichheit. Stellen Sie sich vor Sie haben 4-Bins und Werte von 0 bis 255. Ihre Behälter sollten die folgenden Bereiche
bin low high
0 0 63.75
1 63.75 127.5
2 127.5 191.25
3 191.25 255
Zum Beispiel haben: ein Wert von 57
in bin gehen sollte 0 Ihr Code sagt der Wert geht in allen Fächern! Weil es immer <= z*binsize
Du brauchst etwas mit einer unteren und oberen Grenze.
3. Inkrementieren des entsprechenden bin
Sie verwenden z
über jeden Behälter in einer Schleife, so dass, wenn Sie eine Übereinstimmung finden Sie bin erhöhen sollte z
, Sie verwenden Sie nicht den tatsächlichen Pixelwert außer bei der Bestimmung zu welchem Fach gehört es
das wäre wahrscheinlich Pufferüberlauf Stellen Sie sich vor, Sie haben 4 Bins, und das aktuelle Pixel hat einen Wert von 57. Dieser Code sagt Inkrement Bins 57. Aber Sie haben nur 4 Bins (0-3)
histogram[src_pic_point[x]]++;
Sie wollen nur das ist der Pixelwert in
dass
histogram[z]++;
CODE fällt erhöhen Mit im Auge ist hier überarbeiteter Code (es nicht getestet, sollte aber funktionieren)
vector<int> calcuHisto(const IplImage *src_pic, int anzBin)
{
CvSize size = cvGetSize(src_pic);
double binSize = 256.0/anzBin; //new definition
vector<int> histogram(anzBin,0); //i don't know if this works so I
//so I will leave it
//goes through all rows
for (int y = 0; y<size.height; y++)
{
//grabs an entire row of the imageData
const uchar *src_pic_point = (uchar *)(src_pic->imageData + y*src_pic->widthStep);
//goes through each column
for (int x = 0; x<size.width; x++)
{
//for each bin
for (int z = 0; z < anzBin; z++)
{
//check both upper and lower limits
if (src_pic_point[x] >= z*binSize && src_pic_point[x] < (z+1)*binSize)
{
//increment the index that contains the point
histogram[z]++;
}
}
}
}
return histogram;
}
'int binSize = (size.width/256) * anzBin;' Ist 'binSize' 0 hier wegen Ganzzahlmathematik? Ich meine, wenn size.width kleiner als 256 wäre, wäre 'binSize' nicht 0? – drescherjm
Es ist nicht das, was ich versuche zu berechnen, du hast Recht. Mein Ziel ist etwas wie: binSize = (Image()/256) * anzBin aber wie kann ich das tun? – AloisD
Ersetzen 256 mit 256.0 – drescherjm