AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia FreePascal Grafiken erkennen. Library ?
Thema durchsuchen
Ansicht
Themen-Optionen

Grafiken erkennen. Library ?

Ein Thema von stiftII · begonnen am 4. Mai 2012 · letzter Beitrag vom 11. Mai 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#11

AW: Grafiken erkennen. Library ?

  Alt 4. Mai 2012, 23:01
xD
Genau dies habe ich implementiert und warte nun auf seine Antwort auf meine letzte Frage ^^ (+SAD, einfach und langsam)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#12

AW: Grafiken erkennen. Library ?

  Alt 5. Mai 2012, 02:08
Wandelt sie das Bild in ein verainfachtes Format um, und vergleicht gefundene Muster und formen ? Oder geht die im Endeffekte jeden Pixel durch und vergleicht ?
An der Art und Weise wie du fragst, lässt sich zumindest schon mal gut erkennen, dass du eher nach einer fertigen Lib schauen solltest, als es zu versuchen selbst zu implementieren.
Nein, diese Suche transformiert die Bilder vom Ortsraum in den Frequenzraum, führt eine skaleninvariante Minimabestimmung einer Differenz der Faltung durch, und transformiert das gefundene Minimum zurück in den Ortsraum. Edit: Oder ist das das Maximum im Sinne einer Autokorrelation im Frequenzraum? Der Wein... Was mich brennend interessieren würde: Gibt es dafür auch eine skalen- und rotationsinvariante Version in ähnlicher Einfachheit?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 5. Mai 2012 um 02:11 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Grafiken erkennen. Library ?

  Alt 5. Mai 2012, 09:52
der Algorithmus zum Finden eines Suchbildes in einer großen Vorlage ist :
NORMALIZED CROSS CORRELATION - BZW. FAST NCC

unter http://sourceforge.net/projects/nccfastncc/ gibt eine Demo Application dazu in DELPHI.
Für unser Testbild benötigt die Version auf Source forge ~ 30 sec auf meinem Laptop, aktuell haben wir eine optimierte Version von FAST NCC entwickelt, die Suche
geht ca. 500 x schneller, dh. ist aber aktuell kein Open Source code. Falls Di ein Suchprojekt bearbeitest reicht Dir event. die Public Version des Algorithmuses.

Geändert von bernhard_LA ( 5. Mai 2012 um 09:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#14

AW: Grafiken erkennen. Library ?

  Alt 5. Mai 2012, 14:13
Hier, die einfache Variante mit SAD (Sum of Absolute Differences (siehe Wikipedia))

Delphi-Quellcode:
function findPicture(const Source, Picture: TBitmap): TPoint;
type
  TPRGBTripleRow = Array of PRGBTriple;
var
  SourceScanlineRow : TPRGBTripleRow;
  PictureScanlineRow : TPRGBTripleRow;
  function getRGBDifference(const ColorA, ColorB: PRGBTriple): Integer;
  begin
    Result := abs(ColorA.rgbtBlue - ColorB.rgbtBlue) +
              abs(ColorA.rgbtGreen - ColorB.rgbtGreen) +
              abs(ColorA.rgbtRed - ColorB.rgbtRed);
  end;
  function getPColor(const ScanlineRow: TPRGBTripleRow; const X, Y: Integer): PRGBTriple;
  begin
    Result := PRGBTriple(Integer(ScanlineRow[y]) + x * 3);
  end;
  procedure buildScanlineRows;
  var
    y: Integer;
  begin
    SetLength(SourceScanlineRow, Source.Height);
    for y := 0 to Source.Height - 1 do SourceScanlineRow[y] := Source.ScanLine[y];
    SetLength(PictureScanlineRow, Picture.Height);
    for y := 0 to Picture.Height - 1 do PictureScanlineRow[y] := Picture.ScanLine[y];
  end;
  function _findPicture: TPoint;
  var
    x, y, i, j : Integer;
    SAD : Integer;
    curSAD : Integer;
  begin
    SAD := -1; // not assigned
    for y := 0 to Source.Height - Picture.Height do
      for x := 0 to Source.Width - Picture.Width do
      begin
        curSAD := 0;
        for j := 0 to Picture.Height - 1 do
          for i := 0 to Picture.Width - 1 do
            inc(curSAD, getRGBDifference(getPColor(SourceScanlineRow, x + i, y + j), getPColor(PictureScanlineRow, i, j)));
        if (SAD = -1) or (curSAD < SAD) then
        begin
          SAD := curSAD;
          Result := Point(x, y);
          if SAD = 0 then Exit;
        end;
      end;
  end;
begin
  if (Picture.Width > Source.Width) or (Picture.Height > Source.Height) or
     (Picture.PixelFormat <> pf24bit) or (Source.PixelFormat <> pf24bit) then
    Result := Point(-1, -1)
  else
  begin
    buildScanlineRows;
    Result := _findPicture;
  end;
end;
Edit: Das liefert die linke obere Ecke des Bereiches. Der Bereich hat klarerweise dieselbe Dimension wie "Picture"
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton ( 5. Mai 2012 um 15:18 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Grafiken erkennen. Library ?

  Alt 6. Mai 2012, 11:15
Gibt es für diese Aufgabe irgendwelchen libs ?
Bei Mitov gibt es Bibliotheken für Delphi und .net.
Allerdings weiss ich nicht ob das Lazarus kompatibel ist.
Es gibt da auch Möglichkeiten mit opencv zu linken. Allerdings muss das training "von Hand" gemacht werden.
Ähnlichkeitssuche ist aber out of the box möglich.

Edit: Soeben habe ich gesehen dass nun sogar das Training für neuronale Netze implementiert ist.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.

Geändert von taveuni ( 6. Mai 2012 um 11:18 Uhr)
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#16

AW: Grafiken erkennen. Library ?

  Alt 10. Mai 2012, 18:46
Wie performant muss das ganze sein, wo willst du es genau einsetzen?
Darf das gesuchte Bild Abweichungen haben oder ist es exakt so im Bild enthalten?
Es darf minimale abweichungen haben. Und muss vorallem in jeder Größe gefunden werden.

Was macht die Funktion, die du gepostet hast genau ?

PS: Wenn ich die ausprobieren möchte bekomme ich ein "PRGBTriple not found"
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#17

AW: Grafiken erkennen. Library ?

  Alt 10. Mai 2012, 19:54
Welche Delphiversion verwendest du?

Ich schätz mal, eine etwas ältere, in der es diesen Typ nicht gibt.

Du kannst sie hier definieren:

Delphi-Quellcode:
type
  PRGBTriple = ^TRGBTriple;
  TRGBTriple = record
    rgbtBlue: Byte;
    rgbtGreen: Byte;
    rgbtRed: Byte;
  end;
  TPRGBTripleRow = Array of PRGBTriple;
Die Funktion liefert dir die Koordinaten der linkeren oberen Ecke im Bild, wo es halt gefunden wurde.

Anwendung:

Delphi-Quellcode:
var
  Position: TPoint;
begin
  Position := findPicture(RiesengroßesBild, SuchBild);
  ShowMessage('Gefunden an der Stelle: ' + IntToStr(Position.X) + ' - ' + IntToStr(Position.Y));
end;
Edit: Skalierung wird nicht berücksichtigt! Dies ginge aber auch ganz einfach (jedoch übelst unperformant) indem man das Suchbild zuerst mal richtig runterskaliert, dann schrittweise hochskaliert bis man dieselben Dimensionen wie das "RiesngroßeBild" hat und meine Suchfunktion drüberjagt!

Edit2: Das Ganze ist mehr oder weniger die Implementierung von dem hier (Anwendung: hier)
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (10. Mai 2012 um 19:59 Uhr)
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#18

AW: Grafiken erkennen. Library ?

  Alt 10. Mai 2012, 20:14
Zitat:
Edit: Skalierung wird nicht berücksichtigt! Dies ginge aber auch ganz einfach (jedoch übelst unperformant) indem man das Suchbild zuerst mal richtig runterskaliert, dann schrittweise hochskaliert bis man dieselben Dimensionen wie das "RiesngroßeBild" hat und meine Suchfunktion drüberjagt!
Das ist eine interessante vorgehensweise.

Wie genau würde diese Funktion denn das skalierte Bilder erkennen ?

Beim skallieren gibt es ja auch immer einen qualitätsverlust, wenn das Original-Bild zB kleiner ist als das zu suchende "fragment".

PS: Ich arbeite mit Lazarus (fpc) und hab gerade festgestellt, dass es scanline dort nicht gibt ....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#19

AW: Grafiken erkennen. Library ?

  Alt 10. Mai 2012, 20:22
Pff, um ehrlich zu sein, habe ich keine Lust, dir das anzupassen =/
Scanline ist einfach ein direkterer Weg, auf den Farbspeicher zuzugreifen. Evt. gibts unter Lazarus Pixels[]?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
stiftII

Registriert seit: 2. Sep 2009
Ort: Cuxhaven
122 Beiträge
 
#20

AW: Grafiken erkennen. Library ?

  Alt 11. Mai 2012, 00:13
Pff, um ehrlich zu sein, habe ich keine Lust, dir das anzupassen =/
Scanline ist einfach ein direkterer Weg, auf den Farbspeicher zuzugreifen. Evt. gibts unter Lazarus Pixels[]?
ich hab ne Möglichkeit gefunden scanline zu implementieren ..
jetzt fehlt aber "PixelFormat"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz