Como extrair instantaneamente texto de uma área de tela usando ferramentas de OCR?

24

No Ubuntu 12.10, se eu digitar

gnome-screenshot -a | tesseract output

retorna:

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

Como posso selecionar um texto da tela e convertê-lo em texto (área de transferência ou documento)?

Obrigado!

    
por Erling 12.04.2013 / 00:11

3 respostas

28

Talvez já exista alguma ferramenta que faz isso, mas você também pode criar um script simples com alguma ferramenta de captura de tela e tesseract, como você está tentando usar.

Tome como exemplo este script (no meu sistema eu salvei 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

E com o suporte da área de transferência:

#!/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

Ele usa scrot para usar a tela, tesseract para reconhecer o texto e cat para exibir o resultado. A versão da área de transferência também utiliza xsel para canalizar a saída para a área de transferência.

OBSERVAÇÃO : scrot , xsel , imagemagick e tesseract-ocr não são instalados por padrão, mas estão disponíveis nos repositórios padrão.

Você pode substituir scrot por gnome-screenshot , mas isso pode exigir muito trabalho. Em relação à saída, você pode usar qualquer coisa que possa ler um arquivo de texto (abrir com o Editor de Texto, mostrar o texto reconhecido como uma notificação, etc.).

Versão GUI do script

Aqui está uma versão gráfica simples do script OCR, incluindo uma caixa de diálogo de seleção 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

Além das dependências listadas acima, você precisará instalar o garfo Zenity YAD do webupd8 PPA para fazer o script funcionar.

    
por Salem 12.04.2013 / 16:59
2

Não sei se alguém precisa da minha solução. Aqui está um que corre com o caminho.

Ele mostra o reconhecimento de caracteres em um editor de texto e, se você adicionar o parâmetro "sim", obterá a tradução da ferramenta goggle trans (conexão à Internet é obrigatória) Antes de usá-lo, instale o tesseract-ocr imagemagick e google -trans. Inicie o script, ou seja, no gnome com Alt + F2 quando vir o texto que você deseja reconhecer. Mova o cursor sobre o texto. É isso aí. Este script foi testetd apenas para o gnome. Para outro gerenciador de janelas, é melhor acomodar-se. Para traduzir o texto em outros idiomas, substitua o ID do idioma na linha 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
    
por Ronald 02.05.2018 / 13:58
0

Acabei de fazer um blogging sobre como usar a captura de tela nos dias atuais. Embora eu tenha como alvo o chinês, o elenco da tela e o código estão em inglês. OCR é apenas uma das características.

Recurso para meu OCR:

  • Abra no konsole + vimx OU gedit para continuar a editar.

  • Para o vimx + english, ative a verificação ortográfica.

  • Suporte a seleção dinâmica de idioma sem código.

  • Caixa de diálogo de andamento ao converter e executar tessering que é lento.

Código de função:

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 do chamador:

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 esse código 2 em um script de shell único para ser executado.

Screenshot 1:

Screenshot 2:

    
por 林果皞 12.04.2016 / 11:52