Einzelnen Beitrag anzeigen

MaToBe

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

Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr

  Alt 19. Mai 2010, 18:08
Heyho,

ich muss mich doch noch mal hier melden.

Ich habe mit eurer Hilfe folgenden Code zusammengeschrieben, um ein Bild eines Sudokus in ein SringGrind einzulesen.

Delphi-Quellcode:
//Sudoku einlesen
procedure TfrmScreen.SudokuEinlesen;
var m, n, x, y, h1, h2: integer;
begin
   h1 := 1;
   h2 := 1;
   x := xS;
   y := yS;

   for m := 0 to 8 do
   begin
     for n := 0 to 8 do
     begin
       if h1 <> 3 then
       begin
          sgSudoku.Cells[n,m] := PixelsearchBW(x,y);
          x := x + 29;
          inc(h1);
       end
       else
       begin
          sgSudoku.Cells[n,m] := PixelsearchBW(x,y);
          x := x + 32;
          h1 := 1;
       end;
     end;
     h1 := 1;

     if h2 <> 3 then
     begin
        y := y + 29;
        x := xS;
        inc(h2);
     end
     else
     begin
        y := y + 32;
        x := xS;
        h2 := 1;
     end;
   end;
end;


// 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;
Vom Prinzip her tut der Code genau was er soll, aber es dauert mir zu lange. Für ein normales Sudoku braucht er etwa 2-3 Sekunden.

Deshalb möchte ich ihn nun optimieren und schneller bekommen.

Ich habe gehört/gelesen, dass Scanline bedeutend schneller arbeitet, doch leider habe ich keine Ahnung wie Scanline funtioniert. Pixelsearch war so schön einfach und anschaulich...
  Mit Zitat antworten Zitat