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

27

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!

Erling
fonte
Você recebeu esse erro usando apenas gnome-screenshot -a? Também por que você canaliza a saída para tesseract? Se eu não estiver errado gnome-screenshot guarda a imagem em um arquivo, e não "imprimir"-lo ...
Salem
O aviso deve ser inofensivo se eu olhar no bugzilla. Pergunta: qual é o auto-save-directory? E deixou cair alguma coisa lá? Link interessante: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind:
O gnome-screenchot -a -c deve copiar a seleção para a área de transferência, não é? mas canalizá-lo para tesseract dá o mesmo erro. o diretório padrão é home / pictures (funciona bem).
Erling
1
Acabei de fazer isso usando o gnome-screenshot - então eu tive que editar os arquivos para diminuir a profundidade de cor de 16m para 2 (era texto em preto sobre fundo branco, mas com a sofisticada fonte de hoje, e assim por diante, não era realmente preto ) Eu tive que escalar a imagem em até 200% da original antes de obter um OCR preciso do tesseract - mas funcionou muito bem depois que eu fiz isso.
@SteveLake Hey Steve, obrigado pela sugestão. Editei o script para modificar programaticamente a imagem da maneira que você descreveu antes de fazer o OCR. A taxa de detecção agora deve ser muito melhor.
Glutanimate

Respostas:

35

Talvez já exista alguma ferramenta que faça isso, mas você também pode criar um script simples com alguma ferramenta de captura de tela e tesseract, enquanto estiver tentando usar.

Tome como exemplo este script (no meu sistema, salvei-o 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 suporte à á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 scrotpara tirar a tela, tesseractreconhecer o texto e catexibir o resultado. A versão da área de transferência é utilizada adicionalmente xselpara canalizar a saída para a área de transferência.

uso de amostra

NOTA : scrot, xsel, imagemagicke tesseract-ocrnão são instalados por padrão, mas estão disponíveis nos repositórios padrão.

Você pode substituir scrotpor gnome-screenshot, mas pode levar muito trabalho. Em relação à saída, você pode usar qualquer coisa que possa ler um arquivo de texto (abra com o Editor de Texto, mostre 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 YAD do garfo do Zenity a partir do PUP webupd8 para fazer o script funcionar.

Salem
fonte
funciona greate no terminal! obrigado! Quero screencopy codetext de tutoriais para teste. Como usar o scrot para a área de transferência?
quer
1
o que acontece com os arquivos temporários?
Erling
1
Os arquivos temporários ficam lá até você reiniciar o computador. Se isso for um problema para você, você pode excluí-los no final ( rm $SCR_IMG.png $SCR_IMG.txt).
Salem
1
scrotpor si só não pode usar a área de transferência. Mas existem ferramentas como xclipou xselque podem fazer o que você precisa se for para copiar / colar texto.
Salem
1
Adicionando à resposta de Salem: Se você estiver executando o KDE, poderá chamar outro script para enviar automaticamente o texto que você gerou para a área de transferência, pronto para colar. Você encontrará um script adequado aqui . Siga as instruções nessa página para instalar esse script. Então tudo o que você precisa é adicionar | clipboardao final da linha final do script de Salem.
21713 Chris
3

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

Ele mostra o reconhecimento de caracteres em um editor de texto e, se você adicionar o parâmetro "yes", obterá a tradução da ferramenta goggle trans (a conexão à Internet é obrigatória). Antes de poder usá-lo, instale o tesseract-ocr imagemagick e o google-trans. Inicie o script, ou seja, no gnome, com Alt + F2 quando vir o texto que deseja reconhecer. Mova a cursor pelo texto. É isso aí. Este script foi testado apenas para o gnome. Para outro gerenciador de janelas, é necessário acomodar. 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=$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
fonte
1

Acabei de fazer um blog sobre como usar a captura de tela nos dias modernos. Mesmo tendo como alvo o chinês, mas o elenco e o código da tela estão em inglês. OCR é apenas um dos recursos.

Recurso para meu OCR:

  • Abra no konsole + vimx OU gedit para editar mais.

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

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

  • Caixa de diálogo Progresso ao converter e executar tesseragens, que são lentas.

Código da função:

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 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 no script de shell único para executar.

Captura de tela 1: insira a descrição da imagem aqui

Captura de tela 2: insira a descrição da imagem aqui

林果 皞
fonte
parece ser uma solução decente, mas a legibilidade do seu script é muito ruim
ukos
0

A idéia é sempre que um novo arquivo de captura de tela aparecer na pasta, executar o tesseract OCR e abrir em um editor de arquivo.

Você pode deixar esse script em execução no diretório de saída do seu diretório de saída de captura de tela 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

Você precisará que este seja instalado

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