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

27

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!

Erling
fuente
¿Recibes ese error solo gnome-screenshot -a? ¿También por qué canaliza la salida a tesseract? Si no me equivoco, gnome-screenshot guarda la imagen en un archivo y no la "imprime" ...
Salem
La advertencia debería ser inofensiva si miro a través de bugzilla. Pregunta: ¿cuál es el auto-save-directory? ¿Y dejó caer algo allí? Enlace interesante: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind
Se supone que gnome-screenchot -a -c copia la selección al portapapeles, ¿no? pero conectarlo a tesseract da el mismo error. el directorio predeterminado es home / pictures (funciona bien).
Erling
1
Acabo de hacer esto usando gnome-screenshot: luego tuve que editar los archivos para disminuir la profundidad de color de 16m a 2 (era texto negro sobre fondo blanco, pero con el elegante suavizado de fuentes y demás, no era realmente negro ) Luego tuve que escalar la imagen hasta el 200% del original antes de obtener un OCR preciso de tesseract, pero funcionó muy bien una vez que lo hice.
@ SteveLake Hola Steve, gracias por la sugerencia. Edité el script para modificar programáticamente la imagen de la manera que describiste antes de OCR. La tasa de detección ahora debería ser mucho mejor.
Glutanimate

Respuestas:

35

Tal vez ya haya alguna herramienta que lo haga, pero también puede crear un script simple con alguna herramienta de captura de pantalla y tesseract, ya que está tratando de 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

Se utiliza scrotpara tomar la pantalla, tesseractreconocer el texto y catmostrar el resultado. La versión del portapapeles también utiliza xselpara canalizar la salida en el portapapeles.

uso de muestra

NOTA : scrot, xsel, imagemagicky tesseract-ocrno están instalados por defecto, pero están disponibles en los repositorios por defecto.

Usted puede ser capaz de reemplazar scrotcon gnome-screenshot, pero puede tomar un montón de trabajo. Con respecto 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 del script 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 enumeradas anteriormente, deberá instalar Zenity fork YAD desde el PPA webupd8 para que el script funcione.

Salem
fuente
funciona mejor en terminal! ¡gracias! Quiero hacer una copia de pantalla del texto del código de los tutoriales para probar. ¿Cómo usar scrot para portapapeles?
Erling
1
¿Qué pasa con los archivos temporales?
Erling
1
Los archivos temporales permanecen allí hasta que reinicie su computadora. Si eso es un problema para usted, puede eliminarlos al final ( rm $SCR_IMG.png $SCR_IMG.txt).
Salem
1
scrotpor sí solo no puede usar el portapapeles. Pero hay herramientas como xclipo xselque pueden hacer lo que necesita si es copiar / pegar texto.
Salem
1
Agregando a la respuesta de Salem: si está ejecutando KDE, puede llamar a otro script para enviar automáticamente el texto que ha generado al portapapeles, listo para pegar. Encontrarás un script adecuado aquí . Siga las instrucciones en esa página para instalar ese script. Entonces todo lo que necesita es agregar | clipboardal final de la línea final del script de Salem.
Chris
3

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 Goggle Trans (la conexión a Internet es obligatoria). Antes de poder usarla, 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. Este script fue probado solo para gnome. Para otro administrador de ventanas, debe ser cómodo. Para traducir el texto a otros idiomas, reemplace la ID de idioma en la línea 25.

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

translate="no"
translate=$1

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
Ronald
fuente
1

Acabo de hacer un blog sobre cómo usar la captura de pantalla en la actualidad. A pesar de que apunto al chino, la transmisión de 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 O gedit para editar más.

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

  • Admite la selección dinámica de idiomas sin código duro.

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

Código de función:

function ocr () {
    tmpj="$1"
    tmpocr="$2"
    tmpocr_p="$3"
    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 un script de shell único para ejecutar.

Captura de pantalla 1: ingrese la descripción de la imagen aquí

Captura de pantalla 2: ingrese la descripción de la imagen aquí

林果 皞
fuente
parece una solución decente, pero la legibilidad de su script es muy mala
ukos
0

La idea es que cada vez que aparezcan nuevos archivos de captura de pantalla en la carpeta, ejecute tesseract OCR y se abra en un editor de archivos.

Puede dejar este script en ejecución en el directorio de salida de su directorio de salida de captura de pantalla favorito

#cat wait_for_it.sh
inotifywait -m . -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        cd "$path"
        if [ ${file: -4} == ".png" ]; then
                tesseract "$file" "$file"
                sleep 1
                gedit "$file".txt &
        fi

    done

Necesitará que esto se instale

sudo apt install tesseract-ocr
sudo apt install inotify-tools
Eduard Florinescu
fuente