AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitsprob.
Thema durchsuchen
Ansicht
Themen-Optionen

Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitsprob.

Offene Frage von "MaToBe"
Ein Thema von MaToBe · begonnen am 7. Mai 2010 · letzter Beitrag vom 28. Mai 2010
Antwort Antwort
MaToBe

Registriert seit: 2. Aug 2008
162 Beiträge
 
#1

Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr

  Alt 27. Mai 2010, 18:31
mmh tschuldigung das ich hier dauernd hin und her springe. Ich habe meinen Code jetzt mal versucht, von Pixel[x,y] auf Scanline umzustellen.

Alter Code - lief wunderbar nur zu langsam:
Delphi-Quellcode:
// Pixelsearch - Sucht im imgSudokuBW (Schwarz-Weiß Bild) die einzelnen Ziffern
function TfrmScreen.PixelSearchBW(x:integer; y:integer):string;
var m, n : integer;
    Abweichung_1, Abweichung_2, Abweichung_3, Abweichung_4,
    Abweichung_5, Abweichung_6, Abweichung_7, Abweichung_8,
    Abweichung_9 : real;
    kleinste : array[1..9] of real;
    kleinsteP : integer;
    i : integer;
    AnzahlSchwarz : integer;
begin
  Abweichung_1 := 0;
  Abweichung_2 := 0;
  Abweichung_3 := 0;
  Abweichung_4 := 0;
  Abweichung_5 := 0;
  Abweichung_6 := 0;
  Abweichung_7 := 0;
  Abweichung_8 := 0;
  Abweichung_9 := 0;
  AnzahlSchwarz := 0;

  for m := x to x+25 do
  begin
     for n := y to y+25 do
     begin
         Abweichung_1 := Abweichung_1 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img1.Canvas.Pixels[m-x,n-y]));
         Abweichung_2 := Abweichung_2 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img2.Canvas.Pixels[m-x,n-y]));
         Abweichung_3 := Abweichung_3 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img3.Canvas.Pixels[m-x,n-y]));
         Abweichung_4 := Abweichung_4 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img4.Canvas.Pixels[m-x,n-y]));
         Abweichung_5 := Abweichung_5 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img5.Canvas.Pixels[m-x,n-y]));
         Abweichung_6 := Abweichung_6 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img6.Canvas.Pixels[m-x,n-y]));
         Abweichung_7 := Abweichung_7 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img7.Canvas.Pixels[m-x,n-y]));
         Abweichung_8 := Abweichung_8 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img8.Canvas.Pixels[m-x,n-y]));
         Abweichung_9 := Abweichung_9 + Abs(GetRValue(imgSudokuBW.Canvas.Pixels[m,n]) - GetRValue(img9.Canvas.Pixels[m-x,n-y]));

         if imgSudokuBW.Canvas.Pixels[m,n] = clBlack then
            inc(AnzahlSchwarz);

         //imgSudokuBW.Canvas.Pixels[m,n] := clRed;
     end;
  end;

  kleinste[1] := Abweichung_1 / (255*26*26);
  kleinste[2] := Abweichung_2 / (255*26*26);
  kleinste[3] := Abweichung_3 / (255*26*26);
  kleinste[4] := Abweichung_4 / (255*26*26);
  kleinste[5] := Abweichung_5 / (255*26*26);
  kleinste[6] := Abweichung_6 / (255*26*26);
  kleinste[7] := Abweichung_7 / (255*26*26);
  kleinste[8] := Abweichung_8 / (255*26*26);
  kleinste[9] := Abweichung_9 / (255*26*26);

  if AnzahlSchwarz <> 0 then
  begin
    kleinsteP := 1;
    for I := 2 to 9 do
    begin
       if kleinste[i] < kleinste[kleinsteP] then
          kleinsteP := i;
    end;
    Result := inttostr(kleinsteP);
  end
  else
    Result := '0';

end;
Neuer Code - leider kaum schneller und liefert Falsche Zahlenwerte als Result zurück!
Delphi-Quellcode:
// Pixelsearch - Sucht im imgSudokuBW (Schwarz-Weiß Bild) die einzelnen Ziffern
function TfrmScreen.PixelSearchBW(x:integer; y:integer):string;
var m, n : integer;
    Abweichung_1, Abweichung_2, Abweichung_3, Abweichung_4,
    Abweichung_5, Abweichung_6, Abweichung_7, Abweichung_8,
    Abweichung_9 : real;
    kleinste : array[1..9] of real;
    kleinsteP : integer;
    i : integer;
    AnzahlSchwarz : integer;
    P, P1, P2, P3, P4,
    P5, P6, P7, P8, P9 : PByteArray;
begin
  Abweichung_1 := 0;
  Abweichung_2 := 0;
  Abweichung_3 := 0;
  Abweichung_4 := 0;
  Abweichung_5 := 0;
  Abweichung_6 := 0;
  Abweichung_7 := 0;
  Abweichung_8 := 0;
  Abweichung_9 := 0;
  AnzahlSchwarz := 0;

  imgSudokuBW.Picture.Bitmap.PixelFormat:= pf24Bit;

  for m := x to x+25 do
  begin
     P := imgSudokuBW.Picture.Bitmap.ScanLine[m];
     P1 := img1.Picture.Bitmap.ScanLine[m-x];
     P2 := img2.Picture.Bitmap.ScanLine[m-x];
     P3 := img3.Picture.Bitmap.ScanLine[m-x];
     P4 := img4.Picture.Bitmap.ScanLine[m-x];
     P5 := img5.Picture.Bitmap.ScanLine[m-x];
     P6 := img6.Picture.Bitmap.ScanLine[m-x];
     P7 := img7.Picture.Bitmap.ScanLine[m-x];
     P8 := img8.Picture.Bitmap.ScanLine[m-x];
     P9 := img9.Picture.Bitmap.ScanLine[m-x];
     for n := y to y+25 do
     begin
         Abweichung_1 := Abweichung_1 + Abs(GetRValue(P[n]) - GetRValue(P1[n-y]));
         Abweichung_2 := Abweichung_2 + Abs(GetRValue(P[n]) - GetRValue(P2[n-y]));
         Abweichung_3 := Abweichung_3 + Abs(GetRValue(P[n]) - GetRValue(P3[n-y]));
         Abweichung_4 := Abweichung_4 + Abs(GetRValue(P[n]) - GetRValue(P4[n-y]));
         Abweichung_5 := Abweichung_5 + Abs(GetRValue(P[n]) - GetRValue(P5[n-y]));
         Abweichung_6 := Abweichung_6 + Abs(GetRValue(P[n]) - GetRValue(P6[n-y]));
         Abweichung_7 := Abweichung_7 + Abs(GetRValue(P[n]) - GetRValue(P7[n-y]));
         Abweichung_8 := Abweichung_8 + Abs(GetRValue(P[n]) - GetRValue(P8[n-y]));
         Abweichung_9 := Abweichung_9 + Abs(GetRValue(P[n]) - GetRValue(P9[n-y]));

         if P[n] = clBlack then
            inc(AnzahlSchwarz);

         //imgSudokuBW.Canvas.Pixels[m,n] := clRed;
     end;
  end;

  kleinste[1] := Abweichung_1 / (255*26*26);
  kleinste[2] := Abweichung_2 / (255*26*26);
  kleinste[3] := Abweichung_3 / (255*26*26);
  kleinste[4] := Abweichung_4 / (255*26*26);
  kleinste[5] := Abweichung_5 / (255*26*26);
  kleinste[6] := Abweichung_6 / (255*26*26);
  kleinste[7] := Abweichung_7 / (255*26*26);
  kleinste[8] := Abweichung_8 / (255*26*26);
  kleinste[9] := Abweichung_9 / (255*26*26);

  if AnzahlSchwarz <> 0 then
  begin
    kleinsteP := 1;
    for I := 2 to 9 do
    begin
       if kleinste[i] < kleinste[kleinsteP] then
          kleinsteP := i;
    end;
    Result := inttostr(kleinsteP);
  end
  else
    Result := '0';

end;
Die Images 1 bis 9 werden auch auf pf24Bit gesetzt.

Warum funktioniert nach der Umstellung (habe wirklich nur diese eine Funktion geändert) mein Code nicht mehr?

Einen großen Performancegewinn habe ich auch nicht...
  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 17: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 by Thomas Breitkreuz