AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

Ein Thema von bernhard_LA · begonnen am 11. Jun 2020 · letzter Beitrag vom 21. Jun 2020
Antwort Antwort
bernhard_LA

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

Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 11. Jun 2020, 15:06
ich versuche mich gerade ein einer Portierung des VCL Projekts zur Kreis und Linien Erkennung https://sourceforge.net/projects/houghtransforma/
von VCL auf FMX

die Funktion IsPixel() prüft ob der Mittelwert aus r,g,b-Kanal größer als ein Schwellwert ist und gibt dafür ein true / false zurück.
Unter VCL gehts perfekt, Schnell ( < Sekunde) , die FMX
Variante rechnet ca. 10 min .... und vermutlich noch nicht mal richtig


Delphi-Quellcode:
{$IFDEF  FRAMEWORK_VCL}

function IsPixel(xpos, ypos: integer; aBitmap: TBitMap;
  ThresHold: integer): boolean;
var
  p: pbyteArray;
  r, g, b, mean: integer;
begin

  aBitmap.PixelFormat := pf24bit;

  if (ypos <= aBitmap.Height - 1) and (xpos <= aBitmap.Width - 1) then

  begin
    p := aBitmap.ScanLine[ypos];

    r := p[3 * xpos];
    g := p[3 * xpos + 1];
    b := p[3 * xpos + 2];
    mean := ((round(r) + round(g) + round(b)) div 3);

    if (mean > ThresHold) then
      result := true
    else
      result := false;

  end
  else
  begin
    result := false
  end;

end;

{$ENDIF}
{$IFDEF  FRAMEWORK_FMX}

function IsPixel(xpos, ypos: integer; aBitmap: TBitMap;
  ThresHold: integer): boolean;
var
  r, g, b, mean: integer;

  bitdata: TBitmapData;

  C: TAlphaColor;
begin
  if (aBitmap.Map(TMapAccess.Read, bitdata)) then
    try

      C := bitdata.GetPixel(xpos, ypos);

      r := TAlphaColorRec(C).r;
      g := TAlphaColorRec(C).g;
      b := TAlphaColorRec(C).b;

      mean := round((r + g + b) / 3);

      if (mean > ThresHold) then
        result := true
      else
        result := false;

    finally
      aBitmap.Unmap(bitdata);
    end;
end;

{$ENDIF}
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.168 Beiträge
 
Delphi 12 Athens
 
#2

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 11. Jun 2020, 16:17
Ich würde versuchen nicht für jedes Pixel Map,Unmap aufzurufen,
und womöglich auch den übergeordneten Caller optimieren.
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 15. Jun 2020, 22:28
gibt es in FMX eine schnellere Funktion , Option ohne Map, Unmap auf ein Pixel zuzugreifen .... ?

nicht immer kann ich den Caller wie im Beispiel oben optimieren
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.558 Beiträge
 
Delphi 12 Athens
 
#4

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 15. Jun 2020, 22:51
Sowohl die VCL- als auch die FMX Lösung könnte man nur akzeptieren, wenn man insgesamt nur ein Pixel prüfen müsste, z.B. um herauszubekommen, welcher Farbwert gerade unter der aktuellen Mausposition ist.

Aber ich gehe mal davon aus, dass bei Deiner Aufgabenstellung ein paar mehr Pixel zu prüfen sind.

Dann ist es doch naheliegend, einmal den Zugriff auf die Bitmap zu nehmen (also if (aBitmap.Map(TMapAccess.Read, bitdata)) then) und dann alle relevanten Pixel der Bitmap auf einmal durchzulaufen (und nicht nur eines zu prüfen) und dann den Zugriff auf die Bitmap wieder freizugeben....
  Mit Zitat antworten Zitat
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
207 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 16. Jun 2020, 07:43
Wie sieht es denn aus, wenn du es in der FMX-Version auch mit Scanlines versuchst (TBitmapData.GetScanline).
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.168 Beiträge
 
Delphi 12 Athens
 
#6

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 16. Jun 2020, 10:52
nicht immer kann ich den Caller wie im Beispiel oben optimieren
Dann würde vielleicht helfen ein "Shadow-Bitmap" zu führen, das vielleicht auch nur ein TAlphaColor array Buffer ist.
Der dann nur bei Bedarf am Stück in das echte Bitmap kopiert wird.
Macht aber wohl nur Sinn wenn die Bitmaps nicht zu groß werden, und Du nicht dauernd neue Bilder laden musst.

Bitmaps in FMX kann man auch über die Texture-Komponenten verwalten, vielleicht gibt es da auch was Passendes für Dich.
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 20. Jun 2020, 23:10
was macht eigentlich die map Funktion genau ?
im Task Manager ist meine GPU auf 80 % für 10 min

der VCL code hat eine Laufzeit im Sekunden Bereich
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Kreise und Linien Erkennen , jetzt mit FMX (LINUX)

  Alt 21. Jun 2020, 01:21
Wenn du Map und Unmap außerhalb deiner Schleife aufrufen würdest, dann wäre das auch Ruckzuck erledigt.
Ansonsten würde einfach ein Debuggen mit Debug-DCUs und F7 dir schon weiterhelfen zu erkennen, dass ein ständiges hin- und herkopieren des Bitmaps aus dem Grafikkartenspeicher in den CPU erreichbaren RAM pro (!) einzelnen Pixel nicht die schnellste Lösung ist.
  Mit Zitat antworten Zitat
Antwort Antwort


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:19 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