So einen Fall hatte ich mal in einer Übung auf der Uni
Na, ich mach das vorerst noch zum Glück nur als Hobby
Sind die Regionen so gestaltet, dass sich die umschreibende Rechtecke nicht überschneiden, oder ist das nicht sicher gewährleistet?
Das ist nicht gewährleistet. Sorry, hab mich oben falsch ausgedrückt, ich suche natürlich nicht nach der konvexen Hülle, sondern nach den exakten Rechtecken, die diese Farbe beinhaltet. Ist vielleicht besser anhand eines Beispiels :
http://www.aichler.net/test.png
Das QImage ist eine Maske für ein QPixmap, indem bei einem Event ein bestimmter Bereich, definiert durch die entsprechende Farbe in der Maske, durch ein anderes QPixmap ersetzt werden muss ( per bitBlt );
Ich hab jetzt erst mal beim Grundproblem, den Rechtecken, angefangen.
Das mit den Punkten suchen und die dann in Rechtecke aufteilen, hab ich ad acta gelegt. Statt dessen hab ich mir gedacht, ich suche zuerst den linken oberen Pixel der Farbe, indem ich das Bild von links oben nach rechts unten scanne, und bestimme dann zuerst die horizontale Breite.
Jede weitere Linie in dem Bild, die die gleiche x Koordinate hat und die gleiche Breite, wird dem Rechteck zugeordnet.
Wenn nicht, wird ein neues Rechteck erstellt.
Hier mal die Implementation:
Code:
const QRectArray search (QImage *img, const QRgb& rgb)
{
QPtrStack <QRect> stack;
QRect *cr = 0x0;
int width = img->width ();
int height = img->height ();
int items = 0;
for (int my=0; my < height; my++)
{
for (int mx=0; mx < width; mx++)
{
if (compare (img->pixel (mx,my), rgb))
{
/* top left edge of the color has been found */
for (int x=mx; x < width; x++)
{
/*search for the color´s horizontal end*/
if ( ! compare (img->pixel (x, my), rgb))
{
/*end has been found, color width is x-mx */
if ( ! cr || (mx != cr->x () && (x-mx) != cr->width ()))
{
cr = new QRect (mx, my, (x-mx), 1);
Q_CHECK_PTR (cr);
stack.push (cr);
items++;
}
else
/*enlarge rectangle by one line*/
cr->setHeight (cr->height () + 1);
/*break both x loops*/
x = mx = width;
}
}
}
} /* x */
} /* y */
QRectArray a(items--);
while (items >= 0)
a.insert (items--, stack.pop ());
return (a);
}
Die Funktion compare () ist lediglich dazu da, den Farbvergleich um einen definierten Fehlerbereich zu entschärfen.
Ist das eher ein bescheidener Ansatz ?
Gruß micha
Lesezeichen