000
07.10.2017, 23:24 Uhr
Yadgar
|
Hi(gh)!
Nach mehreren Monaten Pause bin ich mal wieder mit YIP (Yadgar's Image Processor), meinem kommandozeilenbasierten Bildbearbeitungsprogramm für Linux und Windows zugange... und komme bei der Funktion count zum Zählen von Farben in einem Bild nicht weiter.
Hier die Funktion:
C++: |
unsigned int count(vector<vector<pixel> > &img) { unsigned int h = img.size(); unsigned int w = img[0].size(); unsigned int c, r, i, cc=0; bool newcolor; vector<pixel> colors; colors.push_back(img[0].at(0)); cc = 1; cout << "Funktion count wurde aufgerufen!" << endl; newcolor = true; for (r=0; r<h; r++) { for (c=0; c<w; c++) { i=0; while(newcolor==true && i<cc) { cout << "Farbe Rotwert: " << colors[i].get_red() << endl; cout << "Farbe Gr" << uuml << "nwert: " << colors[i].get_green() << endl; cout << "Farbe Blauwert: " << colors[i].get_blue() << endl; cout << "Pixel Rotwert: " << img[r].at(c).get_red() << endl; cout << "Pixel Gr" << uuml << "nwert: " << img[r].at(c).get_green() << endl; cout << "Pixel Blauwert: " << img[r].at(c).get_blue() << endl;
if (img[r].at(c).get_red() == colors[i].get_red() || img[r].at(c).get_green() == colors[i].get_green() || img[r].at(c).get_blue() == colors[i].get_blue()) { newcolor = false; } i++; } if (newcolor) { colors.push_back(img[r].at(c)); cout << "Neue Farbe gefunden!" << endl; cc++; } newcolor = true; // cout << "Zeile " << r <<" ,Spalte " << c << endl; } } return cc; }
|
Gedacht habe ich mir das so: ein zweidimensionaler Vektor, der die Bilddaten vom selbstdefinierten Typ pixel enthält, wird per Referenz an die Funktion übergeben; in der Funktion wird dann ein Vektor für die gefundenen Farben, ebenfalls vom Typ pixel angelegt. Dann wird Zeile für Zeile, Spalte für Spalte für jedes Pixel überprüft, ob die Farbe bereits existiert - die am Beginn des Vergleichs-Durchlaufs (innerste Schleife) auf true gesetzte bool-Variable "newcolor" wird false, sobald im Farb-Vektor eine mit dem aktuellen Pixel übereinstimmende Farbe gefunden wird, was gleichzeitig Abbruchkriterium für die while-Schleife ist. Ist am Ende des Vergleichs-Durchlaufs newcolor immer noch true, wird das jeweilige Pixel-Farbtripel an den Farbvektor angehangen.
Soweit die Theorie. In der Praxis stelle ich leider fest, dass die innerste while-Schleife nur für das allererste Pixel durchlaufen wird (und mit newcolor=false endet, da ich vorher die erste Farbe bereits gesetzt hatte, da ich mir nicht sicher war, ob ich an einen völlig leeren Vektor mit push_back Elemente anfügen kann), dann aber nie mehr. Die äußeren zwei Schleifen werden, wie ich anhand der Testausgaben feststellen könnte, einwandfrei abgearbeiten, also muss der Fehler in der while-Schleife und/oder der anschließenden if-Abfrage stecken. Aber wo?
Bis bald im Khyberspace!
Yadgar -- Flagmaker - ein Programmier-Blog |