AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Code Optimierung: floodfill innerhalb 1/10 sek
Thema durchsuchen
Ansicht
Themen-Optionen

Code Optimierung: floodfill innerhalb 1/10 sek

Ein Thema von mr_emre_d · begonnen am 15. Jun 2008 · letzter Beitrag vom 16. Jun 2008
Antwort Antwort
Seite 1 von 3  1 23      
mr_emre_d
(Gast)

n/a Beiträge
 
#1

Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:34
Hallo liebe Leute,

Ich bin grad schon länger dabei ein Headtracking Programm nachzuschreiben es funktioniert halt auch alles bis auf die Geschwindigkeit des FIlters( hab ne eigene Methode dafür geschrieben )

Jetzt denk ich mir halt ich machs mit floodfill nur nicht mit der schon definierten sondern mit einer eigenen, weil ich nach jedem Schrit die Koordinaten abspeichern will .. -- temporär - versteht sich

hier der daweilige code:

Code:
procedure TForm1.rFloodFill(bmp: TBitmap; Pos: TPoint; Color: TColor);
var
  GColor: TColor; // Get Color
  abs: Byte; // Abstände
  function CheckKol: Boolean;
  begin
    Result:= false;
    if ( pos.X < 1 ) and ( pos.x > bmp.Width - 1 ) and
       ( pos.y < 1 ) and ( pos.y > bmp.Height - 1 )
    then
      Result:= True; // sie ist an der wand !
  end;
begin
  abs:= 2;
  try

  if not CheckKol then
  with pos do
  begin
    if ( not Setted[pos.x-abs,pos.Y] ) and
       ( not ( bmp.Canvas.Pixels[pos.x-abs, pos.y] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x-abs, pos.y] = ClickedColor ) then
    begin
      bmp.Canvas.pixels[pos.x-abs,pos.Y]:= Color;
      Setted[pos.X-abs,pos.Y]:= true;
      rFloodFill( bmp, point( x - abs, y ), Color );
    end else
      exit;

    if ( not Setted[pos.x,pos.Y+abs] ) and
       ( not ( bmp.Canvas.Pixels[pos.x, pos.y+abs] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x, pos.y+abs] = ClickedColor ) then // ist in public definiert, zeigt die erste farbe an !
    begin
      bmp.Canvas.pixels[pos.x,pos.Y+abs]:= Color;
      Setted[pos.X,pos.Y+abs]:= true;
      rFloodFill( bmp, point( x, y+abs ), Color );
    end else
      exit;

    if ( not Setted[pos.x+abs,pos.Y] ) and
       ( not ( bmp.Canvas.Pixels[pos.x+abs, pos.y] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x+abs, pos.y] = ClickedColor ) then
    begin
      bmp.Canvas.pixels[pos.x+abs,pos.Y]:= Color;
      Setted[pos.X+abs,pos.Y]:= true;
      rFloodFill( bmp, point( x + abs, y ), Color );
    end else
      exit;

    if ( not Setted[pos.x,pos.Y-abs] ) and
       ( not ( bmp.Canvas.Pixels[pos.x, pos.y-abs] = Color ) ) and
       ( bmp.canvas.Pixels[pos.x, pos.y-abs] = ClickedColor ) then
    begin
      bmp.Canvas.pixels[pos.x,pos.Y-abs]:= Color;
      Setted[pos.X,pos.Y-abs]:= true;
      rFloodFill( bmp, point( x, y-abs ), Color );
    end else
      exit;
  end;
  except

  end;
end;
ich habs geschafft, dass ich es von 9 Sekunden auf 3 runterbringe nur reicht das immernoch nicht... uund es sind noch n paar Fehler wahrschinlich drinnen + hab gerade jetzt kommentiert also entschuldige ich mich schon im voraus für die Fehler !

MfG
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:36
Der Zugriff auf pixels wird das ganze noch langsam machen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:38
Entferne mal die Subfubktion, sie wird ja sowieso nur einmal aufgerufen
Markus Kinzler
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#4

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:39
ich habs mit scanline auch probiert, bringt nicht viel warum denn auch ? es muss nicht zeilenweiße gelesen werden, sondern nur einzelne pixels + rekursive points ...

kann aber auch sein das ich n denkfehler hab... kein schlaf mehr seit 2 tagen ..

mkinzler: ist schon weg !
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:46
Wenn du die Pixel nicht in zeilenweise Arrays packst, sondern in ein großes, kannst du schnelelr drauf zugreifen. Die Graphics32 ( ) machen das z.B. so. Guck dir die mal an, die sind komplett auf Geschwindigkeit getrimmt.
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#6

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:48
im bisherigen code packe ich noch nichts... da schaue ich nur obs gesetted ist .. mehr nicht ...aber danke für den tipp
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:51
Floodfill ist ja nun auch nicht gerade die schnellste Variante. Du solltest Zeilenweise füllen (Dann bringt Scanline auch etwas). Hab grad vergessen, wie das Verfahren heißt.

P.S.: Dein 'setted' ist das grauslichste Englisch, was ich seit langem gesehen Es bringt zwar performancetechnisch Nichts, aber reputationsmäßig Einiges, bei der Nomenklatur grammatikalisch und orthographisch auf der richtigen Seite zu sein. Wieso nicht ein 'Gesetzt' oder -wenns denn englisch sein soll- 'IsSet'. Na ja, ist OT.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 21:52
Du hast echt länger nicht mehr geshclafen, oder?
Wenn alles in einem Array ist, kannst du sehr einfach ausrechnen, wo der Pixel ist, den du brauchst: Array[Y*Breite+X]; Das ganze kannst du dann auch noch als pointer nehmen (pColor32). Relative Sprünge (also z.b. pixel rechts darunter) sind dann auch sau einfach: inc(pixel,width+1);
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#9

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 22:00
alzaimer: bitte hab erbarmen ...

Meinst du die wo man per scanline alles einließt und dann halt damit dementstprechend rechnet ? Diese methode ist glaub ich langsamer!


Das mit dem Array klingt gut... nur geht es hier um eine Webcam aufnahme ! Und da sich die mühe machne, das ganze bild innerhalb 1/10 sek in einem array abzuspeichern ... hmmm wenn das schneller ist dann heiß ich Franz !
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Code Optimierung: floodfill innerhalb 1/10 sek

  Alt 15. Jun 2008, 22:09
Dann heißte wohl Franz. Nimm dir ein TBitmap32 und zeichne das Webcambild per BitBlt auf das handle des Bitmap 32. Mit .bits und .pixel kannste auf das bild zugreifen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:15 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