Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   OCR-Fähiger Screenshot (https://www.delphipraxis.net/188376-ocr-faehiger-screenshot.html)

Metschu 25. Feb 2016 18:27


OCR-Fähiger Screenshot
 
Hallo zusammen,

um ein externes Programm zu steuern, muss ich ein Fenster auslesen. Da dies aus Label´s besteht, bleibt nur die Möglichkeit der OCR Auswertung.

Ich hab schon mehrere Versionen versucht (Codes aus der DP und dem SwissDelphi Center) einen Screenshot als BMP herzustellen, nur leider ist die Auswertung dieser völlig daneben, obwohl die BitMaps Optisch für mich gut aussehen. Auch ein Konvertieren in JPG brachte keine Änderung.
Aus einem Label "Auftrag bereits Abgerechnet" wird immer "„mag baavs'bgflcdmt“ ' Mu"...

hier mal ein für den Screenshot Code von den Schweizern:

Delphi-Quellcode:
procedure ScreenShot(hWindow: HWND; bm: TBitmap);
var
  Left, Top, Width, Height: Word;
   R: TRect;
   dc: HDC;
   lpPal: PLOGPALETTE;
begin
  {Check if valid window handle}
  if not IsWindow(hWindow) then Exit;
   {Retrieves the rectangular coordinates of the specified window}
  GetWindowRect(hWindow, R);
   Left := R.Left;
   Top := R.Top;
   Width := R.Right - R.Left;
   Height := R.Bottom - R.Top;
   bm.Width := Width;
   bm.Height := Height;
   {get the screen dc}
  dc := GetDc(0);
   if (dc = 0) then
   begin
    Exit;
   end;
   {do we have a palette device?}
  if (GetDeviceCaps(dc, RASTERCAPS) and
    RC_PALETTE = RC_PALETTE) then
   begin
    {allocate memory for a logical palette}
    GetMem(lpPal,
       SizeOf(TLOGPALETTE) +
     (255 * SizeOf(TPALETTEENTRY)));
     {zero it out to be neat}
    FillChar(lpPal^,
       SizeOf(TLOGPALETTE) +
     (255 * SizeOf(TPALETTEENTRY)),
       #0);
     {fill in the palette version}
    lpPal^.palVersion := $300;
     {grab the system palette entries}
    lpPal^.palNumEntries :=
       GetSystemPaletteEntries(dc,
       0,
       256,
       lpPal^.palPalEntry);
     if (lpPal^.PalNumEntries <> 0) then
     begin
      {create the palette}
      bm.Palette := CreatePalette(lpPal^);
     end;
     FreeMem(lpPal, SizeOf(TLOGPALETTE) +
     (255 * SizeOf(TPALETTEENTRY)));
   end;
   {copy from the screen to the bitmap}
  BitBlt(bm.Canvas.Handle,
     0,
     0,
     Width,
     Height,
     Dc,
     Left,
     Top,
     SRCCOPY);
   {release the screen dc}
  ReleaseDc(0, dc);
end;

Derzeit versuche ich mit per Komandozeile mit Tesseract auszuwerten.
Mit einem Schaltplaneditor habe ich ein paar Texte erstellt, dies dann als BMP exportiert und die Texte wurden einwandfrei ausgewertet.

Also kann es theoretisch nicht an Tesseract liegen...

Was kann ich noch anpassen?

Gruß

Torsten

zeras 25. Feb 2016 18:54

AW: OCR-Fähiger Screenshot
 
Kann man nicht jeden Text oder jedes Label eines anderen Windows konformen Programmes auslesen?
Ich meine, das Programm hieß Winspy. Damit hatte ich auch schon einmal verschiedene Werte ausgelesen. Wenn es Winspy kann, dann muss es auch anderweitig auszulesen sein.

Harry Stahl 25. Feb 2016 18:55

AW: OCR-Fähiger Screenshot
 
Kommt Dein Auswertungsprogramm mit einer 32-Bit-Bitmap zurecht?

Wenn das nicht sicher ist, könntest Du ja die Screenshot-BMP in eine 24-Bit umwandeln und dann noch mal testen.

HPW 25. Feb 2016 19:28

AW: OCR-Fähiger Screenshot
 
Hallo,

Für Screen-Bitmap Recognition habe ich schon DCR benutzt ( http://www.codeforge.com/article/225779 )
Damit kann man die benutzten Fonts trainieren und eine Texterkennung bauen.
Nur sehr ähnliche Buchstaben können Probleme bereiten.

Grüsse,

Hans-Peter

Metschu 25. Feb 2016 20:28

AW: OCR-Fähiger Screenshot
 
Danke schon mal für die Tips.

Zitat:

Zitat von zeras (Beitrag 1331386)
Kann man nicht jeden Text oder jedes Label eines anderen Windows konformen Programmes auslesen?
Ich meine, das Programm hieß Winspy. Damit hatte ich auch schon einmal verschiedene Werte ausgelesen. Wenn es Winspy kann, dann muss es auch anderweitig auszulesen sein.

Nein, WinSpy erkennt auch keine Labels, das ist ja das Problem.

Zitat:

Zitat von Harry Stahl (Beitrag 1331387)
Kommt Dein Auswertungsprogramm mit einer 32-Bit-Bitmap zurecht?

Wenn das nicht sicher ist, könntest Du ja die Screenshot-BMP in eine 24-Bit umwandeln und dann noch mal testen.

Das brachte auch keine richtige Abhilfe. Der Ausgegebene Text war zwar anders, aber hatte auch nichts mit dem Ursprünglichen zu tun... ("mag huuvslhwldlrt lag—lm;"):cry:

Zitat:

Zitat von HPW (Beitrag 1331391)
Hallo,
Für Screen-Bitmap Recognition habe ich schon DCR benutzt ( http://www.codeforge.com/article/225779 )
Damit kann man die benutzten Fonts trainieren und eine Texterkennung bauen.
Nur sehr ähnliche Buchstaben können Probleme bereiten.

Muss ich mir mal in ruhe anschauen...

hanvas 26. Feb 2016 09:12

AW: OCR-Fähiger Screenshot
 
Zitat:

Zitat von Metschu (Beitrag 1331383)
Hallo zusammen,
Derzeit versuche ich mit per Komandozeile mit Tesseract auszuwerten.
Mit einem Schaltplaneditor habe ich ein paar Texte erstellt, dies dann als BMP exportiert und die Texte wurden einwandfrei ausgewertet.

Also kann es theoretisch nicht an Tesseract liegen...

Tesseract neigt dazu schlechte bis unbrauchbare Ergebnisse zu liefern wenn das Eingangsbild nicht so ist wie es für Tesseract sein sollte, du solltest in etwas

300 dpi
12 Punkt Schriftgröße

haben, weitere Sollgrößen werden auch unter https://github.com/tesseract-ocr/tes...ImproveQuality genannt.

Versuche dein Bild entsprechend zu skalieren. Tesseract bzw. die verwendete Library (Leptonica http://www.leptonica.com/) unterstützt 32Bit Farbbilder allerdings wird für die Texterkennung normalerweise ein intern daraus abgeleitetes Graustufenbild oder S/W Bild verwendet. Wenn die unterschiedlichen Farben dicht beieinander liegen und gleiche oder ähnliche Helligkeitswerte produzieren dann gehen bei der Wandlung ggf. Informationen verloren. Evtl. ist es eine gute Idee die Wandlung Farbe - Graustufen oder Farbe - SW selbst vorzunehmen, weil Du dann Einfluss auf das erzeugte Bild nehmen kannst und Konvertierungsfehler ausgleichen kannst.

Bevor Du dich an eine Implementierung mit Delphi ranmachst, kannst Du natürlich ein beliebiges Grafikprogramm nehmen und erst mal Deinen Screenshot damit Skalieren und anpassen um auf der Komandozeile auszuprobieren ob die Änderungen was bringen.

cu Ha-Jö

madas 26. Feb 2016 13:13

AW: OCR-Fähiger Screenshot
 
Von Abbyy gibt es auch einen Screenshot Reader. Vielleicht lässt sich dieser ja irgendwie "fernsteuern". :)
Man müsste in dem Tool nur folgende Schritte simulieren: einen Button drücken, den Mouse-Zeiger zum Startpunkt bewegen, linke Mouse-Taste drücken, Mouse-Zeiger zum Endpunkt bewegen und linke Mouse-Taste wieder loslassen. Danach erfolgt die automatische Texterkennung und das Ergebnis wird in die jeweilig gewählte Ausgabe geschoben.

Button-Klick siehe: http://www.c-sharpcorner.com/uploadf...r-application/

Metschu 27. Feb 2016 19:35

AW: OCR-Fähiger Screenshot
 
So, nach einigem Testen klappt es dann wie folgt:
  • Schriftart in dem Auszulesenden Programm auf "OCR-B" eingestellt
  • Schriftgröße auf 14 angepasst
  • Bitmap auf Schwarz-Weiß geändert

Gruß

Torsten

mael 28. Feb 2016 01:27

AW: OCR-Fähiger Screenshot
 
Zitat:

Zitat von Metschu (Beitrag 1331383)
um ein externes Programm zu steuern, muss ich ein Fenster auslesen. Da dies aus Label´s besteht, bleibt nur die Möglichkeit der OCR Auswertung.

Was für eine Art Label sind es denn? Wenn es VCL TLabel sind kann man sie aus anderen Programmen mit kleinen Tricks auslesen (ReadProcessMemory).
Ich habe dazu mal Code geschrieben.

Wenn man den Code der das Label kennt erzeugt ist es eventuell auch mit anderen Labelarten möglich. Screenreader hooken z.b. TextOut und ähnliche Win-API-Aufrufe.

Wird sich das Programm noch ändern/wird es noch entwickelt? In was ist es geschrieben? All die Infos könnten helfen.

Edit: Andererseits wenn die OCR-Methode funktioniert reicht das wohl.

mensch72 28. Feb 2016 11:33

AW: OCR-Fähiger Screenshot
 
Eine wirklich gute Lösung für genau diesen Anwendungsfall kommt von ScreenOCR

http://www.screenocr.com/

Funktioniert super, kostet nur 29USD und ist gut dokumentiert per API gewollt und sauber voll integierbar.
Bei dem Preis kann ich keine Stunde versuchen es selbst zu basteln und dauzu auch nocht dokumentieren, bzw. "ewige" Foren & INet Recherche betreiben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz