¿Cómo se puede extraer texto de manera instantánea de un área de pantalla usando herramientas de OCR?

25

En Ubuntu 12.10, si escribo

gnome-screenshot -a | tesseract output

vuelve:

** Message: Unable to use GNOME Shell's builtin screenshot interface, resorting to fallback X11.

¿Cómo puedo seleccionar un texto de la pantalla y convertirlo en texto (portapapeles o documento)?

¡Gracias!

    
pregunta Erling 11.04.2013 - 22:11

3 respuestas

30

Tal vez ya haya alguna herramienta que lo haga, pero también puede crear una secuencia de comandos simple con alguna herramienta de captura de pantalla y tesseract, como está intentando usar.

Tome como ejemplo este script (en mi sistema lo guardé como /usr/local/bin/screen_ts ):

#!/bin/bash
# Dependencies: tesseract-ocr imagemagick scrot

select tesseract_lang in eng rus equ ;do break;done
# Quick language menu, add more if you need other languages.

SCR_IMG='mktemp'
trap "rm $SCR_IMG*" EXIT

scrot -s $SCR_IMG.png -q 100 
# increase quality with option -q from default 75 to 100
# Typo "$SCR_IMG.png000" does not continue with same name.


mogrify -modulate 100,0 -resize 400% $SCR_IMG.png 
#should increase detection rate

tesseract $SCR_IMG.png $SCR_IMG &> /dev/null
cat $SCR_IMG.txt
exit

Y con soporte para portapapeles:

#!/bin/bash 
# Dependencies: tesseract-ocr imagemagick scrot xsel

select tesseract_lang in eng rus equ ;do break;done
# quick language menu, add more if you need other languages.

SCR_IMG='mktemp'
trap "rm $SCR_IMG*" EXIT

scrot -s $SCR_IMG.png -q 100    
# increase image quality with option -q from default 75 to 100

mogrify -modulate 100,0 -resize 400% $SCR_IMG.png 
#should increase detection rate

tesseract $SCR_IMG.png $SCR_IMG &> /dev/null
cat $SCR_IMG.txt | xsel -bi

exit

Utiliza scrot para tomar la pantalla, tesseract para reconocer el texto y cat para mostrar el resultado. La versión del portapapeles también utiliza xsel para canalizar la salida al portapapeles.

NOTA : scrot , xsel , imagemagick y tesseract-ocr no están instalados por defecto, pero están disponibles desde los repositorios predeterminados.

Es posible que pueda reemplazar scrot con gnome-screenshot , pero puede llevar mucho trabajo. En cuanto a la salida, puede usar cualquier cosa que pueda leer un archivo de texto (abrir con el Editor de texto, mostrar el texto reconocido como una notificación, etc.).

Versión GUI del script

Aquí hay una versión gráfica simple de la secuencia de comandos de OCR que incluye un diálogo de selección de idioma:

#!/bin/bash
# DEPENDENCIES: tesseract-ocr imagemagick scrot yad
# AUTHOR:       Glutanimate 2013 (http://askubuntu.com/users/81372/)
# NAME:         ScreenOCR
# LICENSE:      GNU GPLv3
#
# BASED ON:     OCR script by Salem (http://askubuntu.com/a/280713/81372)

TITLE=ScreenOCR # set yad variables
ICON=gnome-screenshot

# - tesseract won't work if LC_ALL is unset so we set it here
# - you might want to delete or modify this line if you 
#   have a different locale:

export LC_ALL=en_US.UTF-8

# language selection dialog
LANG=$(yad \
    --width 300 --entry --title "$TITLE" \
    --image=$ICON \
    --window-icon=$ICON \
    --button="ok:0" --button="cancel:1" \
    --text "Select language:" \
    --entry-text \
    "eng" "ita" "deu")

# - You can modify the list of available languages by editing the line above
# - Make sure to use the same ISO codes tesseract does (man tesseract for details)
# - Languages will of course only work if you have installed their respective
#   language packs (https://code.google.com/p/tesseract-ocr/downloads/list)

RET=$? # check return status

if [ "$RET" = 252 ] || [ "$RET" = 1 ]  # WM-Close or "cancel"
  then
      exit
fi

echo "Language set to $LANG"

SCR_IMG='mktemp' # create tempfile
trap "rm $SCR_IMG*" EXIT # make sure tempfiles get deleted afterwards

scrot -s $SCR_IMG.png -q 100 #take screenshot of area
mogrify -modulate 100,0 -resize 400% $SCR_IMG.png # postprocess to prepare for OCR
tesseract -l $LANG $SCR_IMG.png $SCR_IMG # OCR in given language
cat $SCR_IMG | xsel -bi # pass to clipboard
exit

Además de las dependencias mencionadas anteriormente, deberá instalar la bifurcación Zenity YAD. del PPA webupd8 para que el script funcione.

    
respondido por el Salem 12.04.2013 - 14:59
2

No sé si alguien necesita mi solución. Aquí hay uno que corre con wayland.

Muestra el reconocimiento de caracteres en un Editor de texto y si agrega el parámetro "sí", obtiene la traducción de la herramienta trans goggle (la conexión a Internet es obligatoria). Antes de poder usarlo, instale tesseract-ocr imagemagick y google -trans. Inicie el script, es decir, en gnome con Alt + F2 cuando vea el texto que desea reconocer. Mueva el curso alrededor del texto. Eso es. Esta secuencia de comandos fue testetd solo para gnome. Para otro administrador de ventanas debe ser acomodado. Para traducir el texto en otros idiomas, reemplace el ID del idioma en la línea 25.

#!/bin/bash
# Dependencies: tesseract-ocr imagemagick google-trans

translate="no"
translate=

SCR_IMG='mktemp'
trap "rm $SCR_IMG*" EXIT

gnome-screenshot -a -f $SCR_IMG.png  
# increase quality with option -q from default 75 to 100
# Typo "$SCR_IMG.png000" does not continue with same name.


mogrify -modulate 100,0 -resize 400% $SCR_IMG.png 
#should increase detection rate

tesseract $SCR_IMG.png $SCR_IMG &> /dev/null

if [ $translate = "yes" ] ; then

        trans :de file://$SCR_IMG.txt -o $SCR_IMG.translate.txt
        gnome-text-editor $SCR_IMG.translate.txt
        else
        gnome-text-editor $SCR_IMG.txt
fi

exit
    
respondido por el Ronald 02.05.2018 - 11:58
0

Acabo de crear un blogging sobre cómo utilizar la captura de pantalla en la actualidad. Aunque apunte a chino, el molde de la pantalla y el código están en inglés. OCR es simplemente una de las características.

Característica para mi OCR:

  • Abrir en konsole + vimx OR gedit para editar más.

  • Para vimx + inglés, habilite la verificación ortográfica.

  • Admite la selección de idioma dinámico sin código.

  • Diálogo de progreso al convertir y testarizar, que es lento.

Código de función:

function ocr () {
    tmpj=""
    tmpocr=""
    tmpocr_p=""
    atom="$(tesseract --list-langs 2>&1)"; atom=('echo "${atom#*:}"'); atom=('echo "$(printf 'FALSE\n%s\n' "${atom[@]}")"'); atom[0]='True'
    ans=('yad --center --height=200 --width=300 --separator='|' --on-top --list --title '' --text='Select Languages:' --radiolist --column '✓' --column 'Languages' "${atom[@]}" 2>/dev/null') && ans="$(echo "${ans:5:-1}")" &&  convert "$tmpj[x2000]" -unsharp 15.6x7.8+2.69+0 "$tmpocr_p" | yad --on-top --title '' --text='Converting ...' --progress --pulsate --auto-close 2>/dev/null && tesseract "$tmpocr_p" "$tmpocr" -l "$ans" 2>>/tmp/tesseract.log | yad --percentage=50 --on-top --title '' --text='Tesseracting ...' --progress --pulsate --auto-close 2>/dev/null && if [[ "$ans" == 'eng' ]]; then konsole -e "vimx -c 'setlocal spell spelllang=en_us' -n $tmpocr.txt" 2>/dev/null; else gedit "$tmpocr.txt"; fi
    rm "$tmpocr_p"
}

Código de llamada:

for cmd in "mktemp" "convert" "tesseract" "gedit" "konsole" "vimx" "yad"; do 
    command -v $cmd >/dev/null 2>&1 || {  LANG=POSIX; xmessage "Require $cmd but it's not installed.  Aborting." >&2; exit 1; }; :;
done
tmpj="$(mktemp /tmp/'date +"%s_%Y-%m-%d"'_XXXXXXXXXX.png)"
tmpocr="$(mktemp -u /tmp/'date +"%s_%Y-%m-%d"'_ocr_XXXXX)"
tmpocr_p="$tmpocr"+'.png'
gnome-screenshot -a -f "$tmpj" 2>&1 >/dev/null | ts >>/tmp/gnome_area_PrtSc_error.log
ocr $tmpj $tmpocr $tmpocr_p &

Combine este código 2 en script de shell único para ejecutar.

Captura de pantalla 1:

Captura de pantalla 2:

    
respondido por el 林果皞 12.04.2016 - 09:52

Lea otras preguntas en las etiquetas