Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rechteck finden in Bild (https://www.delphipraxis.net/98416-rechteck-finden-bild.html)

matashen 27. Aug 2007 08:21


Rechteck finden in Bild
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich hab bei einem Bild beschriftete Rechtecke.

Ich soll jetzt in einem Programm Auswerten wo die Rechtecke liegen mit entsprechenden eckpunkten.

Was ich als Startpunkt habe ist der x/y Mittelpunkt des Rechteckes.

Nachdem aber im Rechteck auch eine Beschriftung ist kann ich nicht einfach "suchen bis schwarzer Punkt in +- x/y von Mittelpunkt" da dann meine Routine dann bei der Schrift stoppt.
Was mir das Ganze noch schwerer macht das zum Teil die Rechtecke dicht an dicht liegen.

Ich komm hier absolut nicht weiter wie ich die Rechtecke effizient und sicher erkennen könnte.

Zur veranschaulichung hab ich einen Bildausschnitt angehängt

Bin für jeden Tip dankbar.

Gruß Matthias

kolbaschedder 27. Aug 2007 09:09

Re: Rechteck finden in Bild
 
Hallo,

wenn du für deine Rechtecke eine Minimale Kantenlänge angeben kannst, bsw. 11 Pixel, dann könntest du solange nach oben (unten, links, rechts) gehen, bis du auf ein schwarzes Pixel mit mindestens links und rechts davon 5 schwarzen Pixeln findest.

MfG
Kolbaschedder

matashen 27. Aug 2007 09:31

Re: Rechteck finden in Bild
 
Liste der Anhänge anzeigen (Anzahl: 1)
Leider kann ich keine minimale Kantenlänge angeben, da auch größere Bereiche mit größerer Beschriftung auftauchen können.

Ich kann aber einen maximale Größe von 1/2 Bitmap.width/heigth annehmen was aber leider nur als abbruchbedingung nutzbar ist um bei Fehler/Ausnahmen einen Endloslauf zu verhindern.

Für eine mögliche Ausnahme habe ich ein Bild angehängt.

Wie ich diese dann behandel weis ich noch nicht, aber vorerst reicht mir die erkennung von Rechtecken.
Also rein als Info mit dabei.

Danke aber schon mal für den Lösungsansatz. Leider ists ein bischen komplizierter.

Gruß Matthias

marabu 27. Aug 2007 09:43

Re: Rechteck finden in Bild
 
Hallo,

wenn die Kanten der Rechtecke so schön exakt waagerecht und senkrecht verlaufen wie in deinem Bild, dann würde ich so vorgehen:

Per ScanLine():

(1) Alle senkrechten und waagerechten Kanten als Punktepaare in dynamischen Arrays VertEdges[] und HorzEdges[] feststellen.

(2) Alle Rechtecke über gleiche Eckpunkte der Kanten identifizieren.

Zusatzaufwand entsteht, wenn die Kantendicke variabel ist.

Grüße vom marabu

Nachtrag: Nimm statt der dynamischen Arrays besser eine TList, die ist effektiver beim Redimensionieren.

matashen 27. Aug 2007 10:00

Re: Rechteck finden in Bild
 
Danke Marabu, der Gedanke ist Klasse :thumb: aber :!:

Zitat:

Per ScanLine():

(1) Alle senkrechten und waagerechten Kanten als Punktepaare in dynmischen Arrays VertEdges[] und HorzEdges[] feststellen.
Da hab ich nix Ahnung wie ich das machen soll :gruebel: , da ich bisher den Umgang mit Scanline gescheut habe :oops: (Variable Farbtiefe der zu bearbeiteten Bitmaps) und ich keinen Peil hab wie ich das dann in den Arrays anlegen soll :gruebel:

Zitat:

(2) Alle Rechtecke über gleiche Eckpunkte der Kanten identifizieren.
Da seh ich kein Problem das bekomm ich hin :???:

Zitat:

Zusatzaufwand entsteht, wenn die Kantendicke variabel ist.
Müßte ich da nicht einfach gucken welche Linien also Punktpaare gleich sind.

Was ich am ende haben möchte(muss) ist eine Liste die ungefähr so aussieht

[ RECHTECK ]
Bezeichner: X-Offs. Y-Offs. obenlinks untenrechts
C803 723 428 ??? ???

Die mit ??? angegebenen Werte muss ich eben ermitteln.

Gruß Matthias

mschaefer 27. Aug 2007 10:07

Re: Rechteck finden in Bild
 
Moin, moin,

Du jagst also Bauelementbeschriftungen. Zerlegen wir das mal in Teilaufgaben:

1. Positionieren im umrahmten Bereich
2. finden der maximalen Top, Bottom, Left und Rigth Positionen
3. Erkennen der Ecken (falls Ecken da)


Sind wir also bei 2. Hier gibt es natürlich viele Varianten. Allgemein ist das jetzt eine Pfadsuche zu einem Extema wo Deine Schildkröte (noch ohne Namen) nur auf weissen Punkten laufen kann.

Das hier könnte weiterhelfen
A* Pfadfindung


Grüße // Martin

matashen 27. Aug 2007 10:14

Re: Rechteck finden in Bild
 
Tach auch mschaefer,

schön das du erkennst das es sich um Bauteile handelt, aber ich jage nicht die Beschriftungen, und ich weis auchnicht was mir der A_Stern bringen sollte. ich suche ja Rechtecke und keinen kürzesten Weg.

Die Beschriftungen sind mir auch egal, da ich ja bereits als Daten den Bezeichner und x,y Offset habe, aber wie ich an die Eckpunkte des rechtecks kommen soll ist mir schleierhaft.

Gruß Matthias



PS: Das zerlegen in Teilaufgabe kannst knicken
1. Ich nicht positionieren muß da ich den xy-Offset weis, das heit ich spring von Teil1 zu Teil2
2.nicht der max sonder DER :!: Positionen des Rechtecks interessieren mich
3.Bei einem Rechteck sollten Rechtecke sein, andernfalls würd ich ja nach Rechtrunden oder sowas fragen :mrgreen:

marabu 27. Aug 2007 10:54

Re: Rechteck finden in Bild
 
Hallo Matthias,

wenn du die Rechtecke nach der von mir vorgestellten Methode identifiziert hast, dann kannst du deine Mittelpunkt-Koordinaten mit PtInRect() gegen die Liste der Rechtecke prüfen und so deine Komponentenliste aufbauen.

Freundliche Grüße

matashen 27. Aug 2007 11:09

Re: Rechteck finden in Bild
 
Ist PtInRect ein Win-API

benutze Delphi, da ist mir der Befehl unbekannt ?

Gruß Matthias

Muetze1 27. Aug 2007 11:12

Re: Rechteck finden in Bild
 
Ja, eine Funktion der WinAPI. Einfach die Unit Windows einbinden und er ist bekannt.

marabu 27. Aug 2007 11:14

Re: Rechteck finden in Bild
 
Deine Code-Vervollständigung zeigt dir die benötigten Parameter:

Delphi-Quellcode:
var
  r: TRect;
  p: TPoint;
begin
  if PtInRect(r, p) then ...
end;

matashen 27. Aug 2007 11:18

Re: Rechteck finden in Bild
 
Noch ne Frage,

Sorry Marabu, aber möchte erst alles Verstanden haben bevor ich losleg und noch grundlegende Fehler mache.

Du hast erwähnt ich soll die Ecken suchen und bei variabler Kantendicke entsteht mehr Zeitaufwand.

Wie meinst du das

und wenn ich schon die Ecken erkenne wäre es dann nicht sinnvoller vier Arrays zu machen, da ich ja dann schon sagen kann ob die Ecke links/rechts/oben/unten ist.

Gruß Matthias

marabu 27. Aug 2007 11:33

Re: Rechteck finden in Bild
 
Als erstes suchst du die Kanten, nicht die Ecken.

Delphi-Quellcode:
type
  TVertEdge = record
    Top: TPoint;
    Bottom: TPoint;
  end;

  THorzEdge = record
    Left: TPoint;
    Right: TPoint;
  end;
Implementiere zuerst den trivialen Fall (Kantendicke = 1 Pixel). Wenn du die Kanten hast, dann kannst du Rechtecke zusammenstellen. Es wird genau vier Kanten geben, zwei vertikale und zwei horizontale, welche gemeinsame Punkte (die Ecken) aufweisen.

Dickere Kanten sind eine relativ einfache Erweiterung. Es läuft darauf hinaus, dass Kanten länger als breit sein müssen und dass du Rechtecke findest, welche ineinander verschachtelt sind. Es werden nur die jeweils äußeren Rechtecke weiter betrachtet, die inneren sind Artefakte des Algorithmus.

matashen 27. Aug 2007 11:46

Re: Rechteck finden in Bild
 
Danke Marabu,

jetzt hab ichs kapiert,

ich werd mal das ganze schreiben und denke das ichs hinbekomme. Scanline hab ich mir auch angesehen.

Vielen Dank für die ausführliche Hilfestellung

Gruß Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz