Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#30

Re: Zahlen in Bild erkennen mit Pixelsearch - Genauigkeitspr

  Alt 28. Mai 2010, 11:41
Du wirfst da einiges durcheinander, verwechselst Zeilen und Spalten, berücksichtigst nicht das 3 Byte zusammen die Farbe eines Pixel bestimmen, vergleichst Byte mit TColor...

Natürlich nicht getestet:
Delphi-Quellcode:
type
  TBGR = packed record
    B, G, R: Byte;
  end;

// Pixelsearch - Sucht im imgSudokuBW (Schwarz-Weiß Bild) die einzelnen Ziffern
function PixelSearchBW(x:integer; y:integer):string;
const
  XCOUNT = 26;
  YCOUNT = 26;
var
  m, n, i, kleinste: integer;
  AnzahlSchwarz : integer;
  Pixel : ^TBGR;
  RedValue: Integer;
  Ziffer: array[1..9] of record
    Bitmap: TBitmap;
    Pixel: ^TBGR;
    Abweichung: Real;
  end;
begin
  imgSudokuBW.Picture.Bitmap.PixelFormat:= pf24Bit;
  AnzahlSchwarz := 0;
  for i := Min(Ziffer) to Max(Ziffer) do
  begin
    with Ziffer[i] do
    begin
      case i of
        1: Bitmap := img1.Picture.Bitmap;
        2: Bitmap := img2.Picture.Bitmap;
        3: Bitmap := img3.Picture.Bitmap;
        4: Bitmap := img4.Picture.Bitmap;
        5: Bitmap := img5.Picture.Bitmap;
        6: Bitmap := img6.Picture.Bitmap;
        7: Bitmap := img7.Picture.Bitmap;
        8: Bitmap := img8.Picture.Bitmap;
        9: Bitmap := img9.Picture.Bitmap;
      else
        Abort;
      end;
      Bitmap.PixelFormat:= pf24Bit;
      Abweichung := 0;
    end;
  end;

  for n := 0 to YCOUNT - 1 do
  begin
    {Pixel verweist auf erste Zeile und erste Spalte}
    for i := Min(Ziffer) to Max(Ziffer) do
      Ziffer[i].Pixel := Ziffer[i].ScanLine[n];
    {Pixel verweist auf erste Zeile und erste Spalte im untersuchten Bereich}
    Pixel := imgSudokuBW.Picture.Bitmap.ScanLine[n + y];
    Inc(Pixel, x);
    for m := 0 to XCOUNT - 1 do
    begin
      {nur den Rotanteil vergleichen (Warum nicht die Gesamthelligkeit?)}
      RedValue := Pixel^.R;
      for i := Min(Ziffer) to Max(Ziffer) do
      begin
        with Ziffer[i] do
        begin
          Abweichung := Abweichung + Abs(Pixel^.R - RedValue);
          {Zeiger auf die nächste Spalte setzen}
          Inc(Pixel);
        end;
      end;

      if (Pixel^.B = 0) and (Pixel^.G = 0) and (Pixel^.R = 0) then
        Inc(AnzahlSchwarz);
      {Zeiger auf die nächste Spalte setzen}
      Inc(Pixel);
    end;
  end;

  if AnzahlSchwarz = 0 then
    Result := '0'
  else
  begin
    kleinste := Min(Ziffer);
    for i := kleinste + 1 to Max(Ziffer) do
    begin
       if Ziffer[i].Abweichung < Ziffer[kleinste].Abweichung then
         kleinste := i;
    end;
    Result := IntToStr(kleinste);
  end;
end;
  Mit Zitat antworten Zitat