Registriert seit: 2. Aug 2008
162 Beiträge
|
Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr
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...
|