Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Screengrab --> OCR -- text, GUI for options/results


  • Please log in to reply
46 replies to this topic
m2
  • Members
  • 4 posts
  • Last active: Jan 04 2016 01:48 PM
  • Joined: 13 Jul 2006
Extension/modification of the script "Capture From Screen To ASCII Art",
http://www.autohotke...opic.php?t=2774

It also makes kind of asci, by converting image to normal text, using a external ocr program.

The script first grabs a screen image, saving this to a file in ppm format, only using AutohotKey. This format was quite simple to use and needed for the OCR program.

Then the script does some preprocessing of the image for better OCR result, this is done with the external program mkbitmap and potrace from http://potrace.sourceforge.net.

After preprocessing it run gocr (OCR) on the preprosecced image, producing a text (hopefully).

Lastly (optionally) the script shows the intermediate results in a information window. This can also be used to trim the processes by altering diffrent options in the "About and Options" window accessable from the tray menu. This step needs the convert program from ImageMagic to make the bmp image files for the GUI.

Left to be done is to make use of a ini file for storing options.

2007-07-19
Change: Programs paths for dependencies is declared in the beginning, and added running gocr thru cmd /c (seems needed on some systems???)

#Persistent
#SingleInstance force

Menu, Tray, Add ; separator
Menu, Tray, Add, About and Options, AboutOptions


/*
Format for PPM image file

P3
# example from the man page
4 4
15
 0  0  0    0  0  0    0  0  0   15  0 15
 0  0  0    0 15  7    0  0  0    0  0  0
 0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0

*/

; Default GUI options
FileSave = 0
InfoWindow = 1

; Default variables
TmpDir =c:\tmp
TmpFile =image_out
ImageFormat =pgm
TmpImageFormat =ppm ; This is the only format supported

; Program paths for dependencies
convert_path =c:\bin
mkbitmap_path =c:\bin
potrace_path =c:\bin
gocr_path =c:\bin
tesseract_path =c:\bin

; Default processing options

;   Image preprocessing
   
   ; mkbitmap
   mkb_s =3 ; scale and interpolate
   mkb_s1 =0 ;-2 linear scale
   mkb_s2 =1 ;-3 cubic scale
   mkb_i =0 ; -i invert
   mkb_f =4 ; highpassfilter
   mkb_t =0.45 ; threshold
   
   ; potrace
   pre_potrace = 1 ; Run bitmap thru potrace
   pot_z =minority ;how to resolve ambiguities in path decomposition
         ;black, white, right,  left,  minority|,  majority,  or  random
   pot_t =2 ;suppress speckles of up to this size (default 2)
   pot_a =4 ;corner threshold parameter (default 1)
   pot_n =0 ;-n turn off curve optimization
   pot_O =0.2 ;curve optimization tolerance (default 0.2)
   pot_u =10 ;Quantize output to 1/unit pixel
   pot_k =0.5 ; Black/white cutof
   pot_i =0 ;-i ; -i invert
   pot_r =0 ; Rotate clock wise degree
   
;   OCR
   ocr_d =-1 ; -d, Dust size
   ocr_s =0 ; -d, Spacewidth
   ocr_m =32 ; -m, operational modes
   ocr_n =0 ; -n, numbers only

;   OCR/TEXT postprocessing
   NoLineReturn = 1


; IniFile Functions
; To be done...

/*
IniRead,
   Bla Bla
Return

IniWrite:
   Bla bla
Return

*/

~^LButton:: ;press ctrl + Left mouse button (for "start")

   stop=0
   
   ; ### Start, Get posisions to grab using window
   ; First method for positioning of screengrab
   CoordMode, Mouse, Screen
   CoordMode, Tooltip, Screen
   MouseGetPos, scan_x_start, scan_y_start
   currentXpos=%scan_x_start%
   currentYpos=%scan_y_start%
   ToolTip, ., scan_x_start, scan_y_start
   
   
   WinSet, Transparent, 100, ahk_class tooltips_class32
   
   Sleep, 800
   
   loop
   {
   
   
   MouseGetPos, scan_x, scan_y
   scan_x-=%currentXpos%
   scan_y-=%currentYpos%
   WinMove, ahk_class tooltips_class32, , , , %scan_x%, %scan_y%
   
   GetKeyState, state, LButton
   
   if state=d
   {
      if stop=0
      {
         tooltip
         break
      }
   }
   
   }
   
   MouseGetPos, scan_x_end, scan_y_end
   ; ### StopGet posisions to grab unsing window
   
   /*
   ; Alternate method for positioning of screengrab
   ^!e:: ;press ctrl-alt-e (for "end")
   CoordMode, Pixel, Screen
   CoordMode, Mouse, Screen
   MouseGetPos, scan_x_end, scan_y_end
   */
   
   ; Main scanning function
   TrayTip, , Scanning...., , 1
   
   CoordMode, Pixel, Screen
   CoordMode, Mouse, Screen
   MouseGetPos, scan_x_end, scan_y_end
   
   scan_current_y=%scan_y_start%
   scan_current_x=%scan_x_start%
   scan_current_line=
   scan_current_line_source=
   Loop
   {
      scan_current_x := scan_current_x + 1
      if scan_current_x > %scan_x_end%
      {
         scan_current_line =%scan_current_line%`n
         scan_current_line_source =%scan_current_line_source%`n
       
         scan_current_y := scan_current_y + 1
         if scan_current_y > %scan_y_end%
            break
         scan_current_x = %scan_x_start%
         continue
      }
      PixelGetColor, found_color, %scan_current_x%, %scan_current_y%
      
      StringMid, scan_rgb_r, found_color, 3, 2
      StringMid, scan_rgb_g, found_color, 5, 2
      StringMid, scan_rgb_b, found_color, 7, 2
      
      scan_current_line_source =%scan_current_line_source% %found_color%
   
      scan_rgb_r =0x%scan_rgb_r%
      scan_rgb_g =0x%scan_rgb_g%
      scan_rgb_b =0x%scan_rgb_b%
   
      SetFormat, integer, d
      scan_rgb_r -= 0
      scan_rgb_g -= 0
      scan_rgb_b -= 0
   
      scan_rgb_r := "   " . scan_rgb_r
      scan_rgb_g := "   " . scan_rgb_g
      scan_rgb_b := "   " . scan_rgb_b
   
      StringRight, scan_rgb_r, scan_rgb_r, 3
      StringRight, scan_rgb_g, scan_rgb_g, 3
      StringRight, scan_rgb_b, scan_rgb_b, 3
      
      found_color =%scan_rgb_r% %scan_rgb_g% %scan_rgb_b%
      
      ;scan_current_line=%scan_current_line% %found_color%
      ;/*
      if scan_current_x > %scan_x_start%
      {
        scan_current_line=%scan_current_line% %found_color%
      }
      else
      {
        scan_current_line=%scan_current_line%%found_color%
      }
      ;*/
   }
   
   ; Add Header for image file
   format :="P3"
   comment :="#File made in Autohotkey"
   hight :=scan_y_end - scan_y_start
   width :=scan_x_end - scan_x_start
   colors :="255"
      
   file_data =
   (
      %format%
      %comment%
      %width%
      %hight%
      %colors%
      %scan_current_line%
   )
   
   TrayTip, , Scan complete, , 1
   sleep, 1000
   TrayTip

   GoSub, MainProcess
   ;MsgBox, The MainProcess subroutine has returned (it is finished).
   return

   MainProcess:
   
   Gui Destroy

   ; File Save, function to allow save a file of the screengrab image
   if FileSave = 1
   {
      FileSelectFile, SelectedFile, 16, , Save image, (*.ppm)
      if SelectedFile =
      {
      MsgBox,,Save canceled, No image saved.
      }
      else
      {
      IfExist %SelectedFile%
      {
         FileDelete %SelectedFile%
         if ErrorLevel <> 0
         {   
            MsgBox The attempt to overwrite "%SelectedFile%" failed.
            return
         }
         else
         {
            FileAppend, %file_data%, *%SelectedFile%
         }
      }
      }
   }
   ; End function, File Save

   ; Cleaning, Functions for cleaning up temporary files from previus grabs
       IfExist %TmpDir%\%TmpFile%.ppm
        {
          FileDelete %TmpDir%\%TmpFile%.ppm
          if ErrorLevel <> 0
          {   
            MsgBox The attempt to remove "%TmpDir%\%TmpFile%.ppm" failed.
            return
          }
        }
   
        IfExist %TmpDir%\%TmpFile%.%ImageFormat%
        {
          FileDelete %TmpDir%\%TmpFile%.%ImageFormat%
          if ErrorLevel <> 0
          {   
            MsgBox The attempt to remove "%TmpDir%\%TmpFile%.%ImageFormat%" failed.
            return
          }
        }
       
        IfExist %TmpDir%\%TmpFile%.txt
        {
          FileDelete %TmpDir%\%TmpFile%.txt
          if ErrorLevel <> 0
          {   
            MsgBox The attempt to remove "%TmpDir%\%TmpFile%.txt" failed.
            return
          }
        }
   
        IfExist %TmpDir%\%TmpFile%.png
        {
          FileDelete %TmpDir%\%TmpFile%.png
          if ErrorLevel <> 0
          {   
            MsgBox The attempt to remove "%TmpDir%\%TmpFile%.png" failed.
            return
          }
        } 
   ; End Cleaning funtions
   
   ; Write, function to write the screengrab image to file
   FileAppend, %file_data%, *%TmpDir%\%TmpFile%.ppm
   
   ; Start Preprocessing image
   
   if mkb_i = 1
   {
      mkb_ii :="-i "
   }
   else
   {
      mkb_ii =
   }
   
   RunWait, %mkbitmap_path%\mkbitmap %mkb_ii% -f %mkb_f% -s %mkb_s% -t %mkb_t% -o %TmpFile%.pbm %TmpFile%.ppm, %TmpDir%, hide,
   
   IfNotExist %TmpDir%\%TmpFile%.pbm
   {
		MsgBox,
		(
		Running mkbitmap "%TmpDir%\%TmpFile%.pbm" failed.
		%mkbitmap_path%\mkbitmap %mkb_ii% -f %mkb_f% -s %mkb_s% -t %mkb_t% -o %TmpFile%.pbm %TmpFile%.ppm
        )
		return
   }
   
   If pre_potrace = 1
   {
      if pot_i = 1
      {
         pot_ii =-i
      }
      else
      {
         pot_ii =
      }
      if pot_n = 1
      {
         pot_nn :="-n "
      }
      else
      {
         pot_nn =
      }
		RunWait, cmd /c %potrace_path%\potrace %pot_ii%%pot_nn%-o %pot_o% -k %pot_k% -r %pot_r% -t %pot_t% -g -a %pot_a% -o %TmpFile%.pgm %TmpFile%.pbm, %TmpDir%, hide,
      IfNotExist %TmpDir%\%TmpFile%.pgm
		{
			MsgBox,
			(
			Running potrace "%TmpDir%\%TmpFile%.pgm" failed.
			cmd /c %potrace_path%\potrace %pot_ii%%pot_nn%-O %pot_o% -k %pot_k% -r %pot_r% -t %pot_t% -g -a %pot_a% -o %TmpFile%.pgm %TmpFile%.pbm
			)
			return
		}
      RunWait, cmd /c %convert_path%\convert %TmpFile%.pgm %TmpFile%.pbm, %TmpDir%, hide,
	}
	; End Preprocessing
   
	; Start OCR processing
	
	; Need to run gocr thru cmd, ???
	RunWait, cmd /c %gocr_path%\gocr -i %TmpDir%\%TmpFile%.pbm -s %ocr_s% -d %ocr_d% -m %ocr_m% -n %ocr_n% -o %TmpFile%.txt, %TmpDir%, hide,
   IfNotExist %TmpDir%\%TmpFile%.txt
	{
		MsgBox,
		(
		Running gocr "%TmpDir%\%TmpFile%.txt" failed.
		cmd /c %gocr_path%\gocr %TmpDir%\%TmpFile%.pbm -s %ocr_s% -d %ocr_d% -m %ocr_m% -n %ocr_n% -o %TmpFile%.txt
		)
		return
	}

   FileRead, ocr_text, %TmpDir%\%TmpFile%.txt
   
   ; Test Tesseract, a other OCR

   ; Tesseract needs a BMP image
   RunWait, cmd /c %convert_path%\convert %TmpFile%.pbm %TmpFile%.t.bmp, %TmpDir%, hide,

	; Start OCR processing
   RunWait, cmd /c %tesseract_path%\tesseract %TmpFile%.t.bmp %TmpFile%.t, %TmpDir%, hide,
   IfNotExist %TmpDir%\%TmpFile%.t.txt
	{
		MsgBox,
		(
		Running gocr "%TmpDir%\%TmpFile%.t.txt" failed.
      cmd /c %tesseract_path%\tesseract %TmpFile%.t.bmp output %TmpFile%.t.txt
		)
		return
	}
   
   FileRead, ocr_t_text, %TmpDir%\%TmpFile%.t.txt

   ; Save the raw OCR result into variable, could be useful
   ocr_raw =%ocr_text%
   ocr_t_raw =%ocr_t_text%

   ; End OCR processing
   
   ; Start OCR postprocessing
   
   
   ; Remove all CR+LF's from the contents
   If NoLineReturn = 1
   {
      StringReplace, ocr_text, ocr_text, `r`n, , All
   }
   
   ; Remove all underscors from the contents:
   StringReplace, ocr_text, ocr_text, _, " ", All
   
   ; Remove all spaces from the contents:
   StringReplace, ocr_text, ocr_text, %A_SPACE%, , All

   ; Remove all " from the contents:
   StringReplace, ocr_text, ocr_text, """, "", All

   /*
   ; Only allow characters in CharOK, not finished
   CharOk := "abc"
   Loop
   {
      IfInString, CharOK, `r`n
   }
   */

   ; End OCR postprocessing
   
   ; Copy postprocessed text to clipboard
   Clipboard =%ocr_text%
   

   /*
   ; Functions to post the result into a search
   #g::
     Send, ^c
     Run, http://www.google.com/search?q=%Clipboard%
   Return
   
   #w::
     Send, ^c
     Run, http://en.wikipedia.org/wiki/Special:Search?search=%Clipboard%
   Return
   */
   
   
   ; Start GUI info Windows, function to show what we got, and how. For debugging mainly
   If InfoWindow = 1
   {

   ; Print size data of screengrab
   Gui, +owner
   Gui, font, s10, Verdana  ; Set 10-point Verdana.
   Gui, Add, Text,, The hight is %hight%, %scan_y_start% - %scan_y_end%.
   Gui, Add, Text,, The width is %width%, %scan_x_start% - %scan_x_end%.
   
   ; Show asci of raw screengrab in hex and preprocessed to rgb
   
   ; Start Fix, Edit field seems to krasch if large
   ImageArea := hight * width
   
   hex =Grab to large to show all hex, show first 10000 chars ony
   rgb =Grab to large to show all rgb, show first 10000 chars ony


   
   If ImageArea < 1000
   {
      hex =%scan_current_line_source%
      rgb =%scan_current_line%
      gui, font,s2, Terminal   
      Gui, Add, Edit, w600 h100 -wrap +HScroll +VScroll, %hex%
      Gui, Add, Edit, w600 h100 -wrap +HScroll +VScroll, %rgb%
   }
   else
   {
      StringLeft, hex_short, scan_current_line_source, 10000
      StringLeft, rgb_short, scan_current_line, 10000

      Gui, font, s10, Verdana  ; Set 10-point Verdana.
      Gui, Add, Text,, %hex%
      gui, font,s2, Terminal   
      Gui, Add, Edit, w600 h100 -wrap +HScroll +VScroll, %hex_short%

      Gui, font, s10, Verdana  ; Set 10-point Verdana.
      Gui, Add, Text,, %rgb%
      gui, font,s2, Terminal   
      Gui, Add, Edit, w600 h100 -wrap +HScroll +VScroll, %rgb_short%
   }
   ; End fix

   
   Gui, font, s10, Verdana  ; Set 10-point Verdana.

   ; Convert images to compatible format for GUI, adjust size if large screengrab
   
   If ImageArea > 5000
   {
      ; convert options to resize image
      con_options =-resize 300x200
   }
   RunWait, cmd /c %convert_path%\convert %con_options% %TmpFile%.ppm %TmpFile%.bmp, %TmpDir%, hide,
   RunWait, cmd /c %convert_path%\convert %con_options% %TmpFile%.pbm %TmpFile%_ocr.bmp, %TmpDir%, hide,

   Gui, Add, Picture,, %TmpDir%\%TmpFile%.bmp
   Gui, Add, Picture,, %TmpDir%\%TmpFile%_ocr.bmp
   Gui, Add, Text,,
   (
      Text from OCR:
   )
   Gui, Add, Edit, xp+100, %Clipboard%
   Gui, Add, Edit, xp+150, %ocr_t_text%
   Gui, Add, Button, default, OK  ; The label ButtonOK (if it exists) will be run when the button is pressed.
   Gui, Add, Button, Default xp+60, Rerun
   Gui, Show, AutoSize,
   Return
   
   ButtonOK:
      GuiClose:
      GuiEscape:
      Gui Destroy
   Return
   
   ButtonRerun: 
      Gui, Submit
      Gosub, MainProcess
   Return

   }
   ; End GUI info Window
   
   /*
   ; Alternate method for positioning of screengrab
   ; press ctrl-alt-b (for "begin")
   ^!b::
      CoordMode, Mouse, Screen
      MouseGetPos, scan_x_start, scan_y_start
   return
   */
   
   ; Clean up tmp
   FileDelete %TmpDir%\%TmpFile%.ppm ; Color image, the raw screengrab picture
   FileDelete %TmpDir%\%TmpFile%.pgm ; Gray
   FileDelete %TmpDir%\%TmpFile%.pbm ; BW
   FileDelete %TmpDir%\%TmpFile%.txt
   
   Return

Return

AboutOptions:
Gui, 2:+owner  ; Make the main window (Gui #1) the owner of the "about box" (Gui #2).
Gui +Disabled  ; Disable main window.
Gui, font, s12, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Text,, Tool for Text extraction from Screen grabs
Gui, 2:Add, Text,, Options:
Gui, 2:Add, Text, xs+10, Image Preprocessing

Gui, 2:Add, Text, xs+20, mkbitmap:
Gui, font, s10, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Checkbox, vmkb_i checked%mkb_i% xs+25, Invert image
Gui, 2:Add, Edit, w35 vmkb_f xs+25, %mkb_f%
Gui, 2:Add, Text, xp+40, Highpassfilter
Gui, 2:Add, Edit, w35 vmkb_t xs+25, %mkb_t%
Gui, 2:Add, Text, xp+40, Threshold
Gui, 2:Add, Edit, w35 vmkb_s xs+25, %mkb_s%
Gui, 2:Add, Text, xp+40, Scale by integer factor
Gui, 2:Add, Radio, Group vmkb_s1 checked%mkb_s1% xs+25, Liner interpolation
Gui, 2:Add, radio, vmkb_s2 checked%mkb_s2% xs+25, Cubic interpolation

Gui, font, s12, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Text, xs+20, potrace:
Gui, font, s10, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Checkbox, vprepotrace checked%prepotrace% xs+25, Run thrue potrace
Gui, 2:Add, DropDownList, w100 vpot_z checked%pot_z% xs+25, black|white|right|left|minority||majority|random
Gui, 2:Add, Text, xp+110, Path decomposition
Gui, 2:Add, Edit, w35 vpot_t xs+25, %pot_t%
Gui, 2:Add, Text, xp+40, Speckles size to remove
Gui, 2:Add, Edit, w35 vpot_a xs+25, %pot_a%
Gui, 2:Add, Text, xp+40, Corner threshold
Gui, 2:Add, Checkbox, vpot_n checked%pot_n% xs+25, No curv optimization
Gui, 2:Add, Edit, w35 vpot_o xs+25, %pot_o%
Gui, 2:Add, Text, xp+40, Curve optimizion tolerance
Gui, 2:Add, Edit, w35 vpot_u xs+25, %pot_u%
Gui, 2:Add, Text, xp+40, Quantize output to 1/unit pixel
Gui, 2:Add, Edit, w35 vpot_k xs+25, %pot_k%
Gui, 2:Add, Text, xp+40, Black/white cutof
Gui, 2:Add, Checkbox, vpot_i checked%pot_i% xs+25, Invert image
Gui, 2:Add, Edit, w35 vpot_r xs+25, %pot_r%
Gui, 2:Add, Text, xp+40, Rotate image clockwise degree

Gui, 2:Add, Text,,

Gui, font, s12, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Text, xs+10, OCR
Gui, font, s10, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Text, xs+25, Operational Mode:
Gui, 2:Add, Edit, w35 vocr_m xp+100, %ocr_m%
Gui, 2:Add, Text, xp+40,
(
Operation mode:
4   Barcode
16   divide overlapping chars
32   context correction
64   char packing
)
Gui, 2:Add, Checkbox, vocr_n checked%ocr_n% xs+25, Only numbers
Gui, 2:Add, Text,,
Gui, 2:Add, Text, xs+10, OCR Postprocessing
Gui, 2:Add, Checkbox, vNoLineReturn checked%NoLineReturn% xs+25, Remove line returns.
Gui, 2:Add, Text,,

Gui, font, s12, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Text, xs+10, GUI
Gui, font, s10, Verdana  ; Set 10-point Verdana.
Gui, 2:Add, Checkbox, vFileSave checked%FileSave%, Allow FileSave
Gui, 2:Add, Checkbox, vInfoWindow checked%InfoWindow%, Show Info Window.
Gui, 2:Add, Text,,
Gui, 2:Add, Button, Default, OK
Gui, 2:Add, Button, Default xp+50, Save
Gui, 2:Add, Button, Default xp+50, Cancel
Gui, 2:Show, r x50
Return

2ButtonOK:
Gui, 1:-Disabled  ; Re-enable the main window (must be done prior to the next step).
Gui, Submit
Gui Destroy  ; Destroy the about box.
Return

2ButtonCancel:
Gui, 1:-Disabled  ; Re-enable the main window (must be done prior to the next step).
Gui Destroy  ; Destroy the about box.
Return

2ButtonSave:
Gui, Submit, NoHide
Gui, 1:-Disabled  ; Re-enable the main window (must be done prior to the next step).
Return

#^r:: ; Reload this script
   Reload
Return


Not Logged In
  • Guests
  • Last active:
  • Joined: --
How fast is this code?

I'm thinking of using something like this to read some screen text during some game play and fire off key-events back to the game, but if it's too slow it won't work.

I guess I'll have to experiment, some.

Excellent work there, btw. It's almost exactly what I was looking for, so that'll make what I'm working on that much easier.

Not Logged In
  • Guests
  • Last active:
  • Joined: --
Anyone else having problems with gocr? It doesn't appear to be working very reliably right now.

Not Logged In
  • Guests
  • Last active:
  • Joined: --
Hehe. Never mind : Garbage in = garbage out.

gocr doesn't like negative images at all, but this can be corrected by proper use of invert image in the pre processing.

Nice script.

gamadren
  • Members
  • 8 posts
  • Last active: Feb 23 2010 01:28 AM
  • Joined: 28 Nov 2006
Yes, I am having trouble with gocr also. Running gocr "path" failed.

I have tried all three versions of gocr including the one from May of 2005.

n-l-i-d
  • Guests
  • Last active:
  • Joined: --
Here is another OCR demo script: ShowOCRUnderMouse.zip (contains all needed files). It does not 'optimize' the image before OCRing, but I found that this 'optimizing' (with potrace or netpbm) does not really generate much better results.

This script will show the current text under mouse

It uses:
- GDIplusWrapper.ahk (by PhiLho)
Converts screen portion to jpg
- djpeg.exe
Converts jpg to pnm
- gocr.exe
OCRs the pnm file
- cmdret.dll/cmdstub.exe
Gets the result from gocr.exe
(since gocr.exe is a 16-bit program, cmdret.dll needs the cmdstub.exe)

When the script is running, you can press the Escape key anytime to exit


Enjoy!

Not Logged In
  • Guests
  • Last active:
  • Joined: --
That's cool - does it work on DirectX ?

Not Logged In
  • Guests
  • Last active:
  • Joined: --
The amusing thing about the "optimizing" in the original script is that it is never used.

This line does the gocr call
   RunWait, cmd /q /c %gocr_path%\gocr -i %TmpDir%\%TmpFile%.pbm  -s %ocr_d% -d %ocr_d% -m %ocr_m% -n %ocr_n% -o %TmpFile%.txt, %TmpDir%, hide,  

and it is using only the .pbm file, which was generated by mkbitmap, and not by potrace, even if potrace was run.


BTW -
While the GDI thing is pretty cool, I am planning on doing something that compares if the image under a particular static area has changed and only run the conversion and OCR on changed images. The GDI program fires off mouse-move which, of course, will change minutely the area every time, and so that event works great for that purpose.

For my purpose, the only reason to trigger a new parse is if the image changes, and for that, I need to know what the last image was, which means that I suspect GDI libraries will be less efficient for that purpose than an image comparison algorithm.

Interesting stuff.

Not Logged In
  • Guests
  • Last active:
  • Joined: --
I've also noticed that the original poster's color space is wrong when capturing the original image. If one opens the original image in an image editor like PSP or ImageMagick, the blues are coming out reds.

Admittedly this makes little difference when performing conversion to black and white for OCR, but it crops up when doing an image comparison with images that may have been captured through other means.

Not Logged In
  • Guests
  • Last active:
  • Joined: --

. If one opens the original image in an image editor like PSP or ImageMagick, the blues are coming out reds.


Although, on further investigation, this could be because he is using the "rarer" P3 ppm format instead of the "raw" P6 ppm format, and maybe the display programs don't know the difference.. Hmm - I suppose I need to investigate further.

m2
  • Members
  • 4 posts
  • Last active: Jan 04 2016 01:48 PM
  • Joined: 13 Jul 2006
It should be the P3 format, its documented in the file at the top ;)

Wrong thought about the colors.

Done some testing with the Tesseract ORC engine, seems better than Gocr.

/m2

tinku99
  • Guests
  • Last active:
  • Joined: --
I get error:
"Running gocr "path\image_out.t.txt" failed.
cmd /c path\image_out.t.bmp output image_out.t.txt

tinku99
  • Guests
  • Last active:
  • Joined: --
fixed it by replacing all occurences of .t. with .
in the script.
works nicely...
thanks.

Murp-e
  • Members
  • 531 posts
  • Last active: Sep 27 2011 11:44 AM
  • Joined: 12 Jan 2007
I've been wanting to do OCR stuff like this for a very long time and I would love to see this script in action. Unfortunately, it doesn't work and only shows:
"One or more CON code pages invalid for given keyboard codeCannot execute C:\DOCUME~1\Murple\DESKTOP\SHOWOCRUNDERMOUSE\GOCR.EXE"

Does anyone know how to work around this?

I am running a Norwegian keyboard on a iMac (running WinXP in BootCamp).

n-l-i-d
  • Guests
  • Last active:
  • Joined: --
According to Microsoft, this is "only" information.

One or more CON code pages invalid for given keyboard code

The KEYB command examined all prepared code pages, and has found that at least one code page is incompatible for your screen console device (CON). This is only information to let you know that your keyboard and screen console are working with different code pages.


You could try changing the code page with the chcp command

To change the active code page to 850 (Multilingual), type:

chcp 850


You could try adding something like the following in the ShowOCRUnderMouse.ahk, Chr(20) should become an Enter (ASCII-Code 20)


AnEnter := Chr(20)

  CMDs =
  (LTrim Join
    djpeg.exe -pnm -grayscale %fileNameDestJ% in.pnm
    ,cmdstub.exe [color=red]chcp 850 %AnEnter%[/color] gocr.exe -i in.pnm
  )

not-tested