OCR araçlarını kullanarak metni anında ekran alanından nasıl çıkarabilirim?


27

Ubuntu 12.10'da yazarsam

gnome-screenshot -a | tesseract output

döner:

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

Ekrandan bir metni nasıl seçip metne nasıl dönüştürebilirim (pano veya belge)?

Teşekkür ederim!


Bu hatayı yalnızca kullanarak gnome-screenshot -amı alıyorsunuz ? Ayrıca çıktıyı tesseract için neden boruya soktunuz? Ben yanlış değilsem gnome-ekran ... bir dosya üzerinde resim kaydeder ve bunu "yazdırmak" değil
Salem

Bugzilla'ya bakarsam uyarı zararsız olmalı. Soru: auto-save-directoryNedir? Ve orada bir şey mi düşürdü? İlginç bağlantı: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind

gnome-screenchot -a -c'nin seçimi panoya kopyalaması bekleniyor, değil mi? ancak onu tesseract için borulamak aynı hatayı verir. varsayılan dizin, ev / fotoğraftır (iyi çalışır).
Erling

1
Bunu sadece gnome-screenshot kullanarak yaptım - Daha sonra renk derinliğini 16 metreden 2'ye düşürmek için dosyaları düzenlemek zorunda kaldım (beyaz arka planda siyah metindi, ancak bugünün süslü yazı tipi yumuşatma ve benzeri durumuyla, gerçekten siyah değildi. ) Daha sonra, tesseract'tan doğru bir OCR almadan önce görüntüyü orijinalin% 200'üne kadar ölçeklendirmek zorunda kaldım - ancak bunu yaptığımda çok işe yaradı.

@ SteveLake Hey Steve, öneri için teşekkürler. Komut dosyasını, OCRing işleminden önce tanımladığınız şekilde programlı olarak değiştirmek için düzenledim. Algılama oranı şimdi daha iyi olmalı.
13:13

Yanıtlar:


35

Belki de bunu yapan bazı araçlar zaten vardır, ancak kullanmaya çalıştığınız ekran görüntüsü aracı ve tesseract ile basit bir komut dosyası da oluşturabilirsiniz.

Örnek olarak bu betiği ele alalım (benim sistemimde kaydettim /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

Pano desteği ile:

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

O kullanır scrot, ekranı almaya tesseractmetni tanımak ve catsonucunu görüntülemek için. Pano sürümü ayrıca xselçıktıyı panoya aktarmak için kullanılır.

örnek kullanım

NOT : scrot, xsel, imagemagickve tesseract-ocrvarsayılan olarak yüklenmez ancak varsayılan depolarından temin edebilirsiniz değildir.

Sen yerine mümkün olabilir scrotile gnome-screenshot, ancak bir sürü iş alabilir. Çıktı ile ilgili olarak, bir metin dosyasını okuyabilen herhangi bir şey kullanabilirsiniz (Metin Düzenleyicide açık, tanınan metni bildirim olarak gösterme, vb.).


Komut dosyasının GUI sürümü

Dil seçimi iletişim kutusunu içeren OCR betiğinin basit bir grafik sürümü:

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

Yukarıda listelenen bağımlılıkların yanı sıra , betiğin çalışması için Zenity fork YAD'yi webupd8 PPA'dan yüklemeniz gerekir .


terminalde greate çalışıyor! teşekkür ederim! Test için öğreticilerden kod metni senaryolamak istiyorum. Panoya scrot nasıl kullanılır?
Erling

1
tempfiles ile ne olur?
Erling

1
Tempfiles, bilgisayarınızı yeniden başlatana kadar orada kalır. Bu sizin için bir sorunsa, sonunda ( rm $SCR_IMG.png $SCR_IMG.txt) silebilirsiniz .
Salem

1
scrottek başına panoyu kullanamazsınız. Ama böyle araçlardır xclipveya xselbunun böyle kopyalamak için ise / Metni yapıştırmak gerekenleri yapabilirsiniz.
Salem

1
Salem'in cevabına ekleme: KDE kullanıyorsanız, oluşturduğunuz metni otomatik olarak panoya göndermek için yapıştırmaya hazır olan başka bir komut dosyasını çağırabilirsiniz. Burada uygun bir betiği bulacaksınız . Bu komut dosyasını yüklemek için o sayfadaki talimatları izleyin. O zaman tek yapmanız gereken | clipboardSalem'in senaryosunun son satırının sonuna eklemek .
Chris

3

Biri benim çözümüme ihtiyaç duyuyor mu bilmiyorum. İşte wayland ile çalışan biri.

Bir Metin Düzenleyici'de karakter tanımayı gösterir ve "evet" parametresini eklerseniz, çeviriyi goggle trans aracından aldınız (İnternet bağlantısı zorunludur) Kullanmadan önce tesseract-ocr imagemagick ve google-trans uygulamasını yükleyin. Tanıtmak istediğiniz metninizi gördüğünüzde, betiği örneğin Altn + F2 ile gnome'da başlatın. İmleç, metni çevreleyen hareket ettirin. Bu kadar. Bu script sadece gnome için test edildi. Diğer pencere yöneticileri için uygun değildir. Metni diğer dillere çevirmek için 25. satırdaki dil kimliğini değiştirin.

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

1

Modern günde ekran görüntüsünün nasıl kullanılacağı hakkında bir blog yazdım . Ben Çince hedef olsa da ekran döküm ve kod ingilizce. OCR sadece özelliklerden biridir.

OCR'ımın özelliği:

  • Daha fazla düzenleme yapmak için konsole + vimx VEYA gedit'te açın.

  • Vimx + ingilizce için yazım denetimini etkinleştirin.

  • Sabit kod olmadan dinamik dil seçimini destekleyin.

  • Dönüştürme ve dönüştürme sırasında ilerleme diyaloğu, hangisi yavaşsa.

İşlev kodu:

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"
}

Arayan kodu:

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 &

Bu 2 kodu çalıştırmak için tek bir kabuk betiğinde birleştirin.

1. Ekran görüntüsü: görüntü tanımını buraya girin

Ekran görüntüsü 2: görüntü tanımını buraya girin


iyi bir çözüm gibi görünüyor ama betiğinizin okunabilirliği çok kötü
ukos

0

Buradaki fikir, OCR'yi çalıştıran klasörde yeni bir ekran görüntüsü dosyası belirdiğinde ve bir dosya düzenleyicide açıldığında ortaya çıkar.

Bu çalışan betiği, en sevdiğiniz ekran görüntüsü çıkış dizininin çıkış dizininde bırakabilirsiniz.

#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

Bu metalize olması için ihtiyacınız olacak

sudo apt install tesseract-ocr
sudo apt install inotify-tools

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.