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