จะดึงข้อความจากพื้นที่หน้าจอโดยใช้เครื่องมือ OCR ได้อย่างไร


27

ใน Ubuntu 12.10 ถ้าฉันพิมพ์

gnome-screenshot -a | tesseract output

มันกลับมา:

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

ฉันจะเลือกข้อความจากหน้าจอและแปลงเป็นข้อความ (คลิปบอร์ดหรือเอกสาร) ได้อย่างไร

ขอขอบคุณ!


คุณได้รับข้อผิดพลาดที่ใช้เท่านั้นgnome-screenshot -aหรือไม่ ยังทำไมคุณท่อส่งออกไปยัง tesseract? ถ้าฉันไม่ผิด gnome-ภาพหน้าจอบันทึกภาพบนไฟล์และไม่ "พิมพ์" มัน ...
ซาเลม

คำเตือนควรจะไม่เป็นอันตรายหากฉันดู Bugzilla คำถาม: อะไรคือauto-save-directory? แล้วมันหล่นอะไรลงไปที่นั่นไหม? ลิงค์ที่น่าสนใจ: forums.debian.net/viewtopic.php?f=6&t=85683
Rinzwind

gnome-screenchot -a -c ควรจะคัดลอกส่วนที่เลือกไปยังคลิปบอร์ดใช่ไหม? แต่การส่งไปยัง tesseract จะให้ข้อผิดพลาดเดียวกัน ไดเรกทอรีเริ่มต้นคือบ้าน / รูปภาพ (ทำงานได้ดี)
Erling

1
ทำเพียงแค่นี้โดยใช้ gnome-หน้าจอ - ฉันแล้วก็ต้องแก้ไขไฟล์เพื่อลดความลึกของสีจาก 16m 2 (มันเป็นตัวอักษรสีดำบนพื้นสีขาว แต่มีการปรับให้เรียบแบบอักษรแฟนซีในวันนี้และสิ่งที่เกี่ยวกับมันไม่ได้จริงๆสีดำ ) จากนั้นฉันต้องปรับขนาดภาพให้มากถึง 200% ของต้นฉบับก่อนที่ฉันจะได้ OCR ที่ถูกต้องจาก tesseract - แต่มันก็ใช้ได้ดีจริงๆเมื่อฉันทำแบบนั้น

@ SteveLake เฮ้ Steve ขอบคุณสำหรับคำแนะนำ ฉันแก้ไขสคริปต์เพื่อปรับเปลี่ยนภาพในแบบที่คุณอธิบายก่อน OCRing โดยทางโปรแกรม อัตราการตรวจจับตอนนี้น่าจะดีขึ้นมาก
Glutanimate

คำตอบ:


35

อาจมีเครื่องมือบางอย่างที่ทำเช่นนั้น แต่คุณสามารถสร้างสคริปต์อย่างง่ายด้วยเครื่องมือจับภาพหน้าจอและ tesseract ขณะที่คุณพยายามใช้

นำตัวอย่างสคริปต์นี้ (ในระบบของฉันฉันบันทึกไว้เป็น/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

และด้วยการสนับสนุนคลิปบอร์ด:

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

มันใช้scrotในการหน้าจอtesseractเพื่อรับรู้ข้อความและcatเพื่อแสดงผล เวอร์ชั่นของคลิปบอร์ดใช้ประโยชน์เพิ่มเติมxselในการส่งออกไปยังคลิปบอร์ด

การใช้งานตัวอย่าง

หมายเหตุ : scrot, xsel, imagemagickและtesseract-ocrไม่ได้ติดตั้งโดยค่าเริ่มต้น แต่มีอยู่จากที่เก็บเริ่มต้น

คุณอาจจะสามารถที่จะแทนที่scrotด้วยgnome-screenshotแต่มันอาจจะใช้เวลามากในการทำงาน คุณสามารถใช้สิ่งใดก็ได้ที่สามารถอ่านไฟล์ข้อความ (เปิดด้วย Text Editor แสดงข้อความที่รู้จักเป็นการแจ้งเตือน ฯลฯ )


สคริปต์ GUI เวอร์ชัน

ต่อไปนี้เป็นเวอร์ชันกราฟิกอย่างง่ายของสคริปต์ OCR รวมถึงกล่องโต้ตอบการเลือกภาษา:

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

นอกเหนือจากการพึ่งพาที่กล่าวข้างต้นคุณจะต้องติดตั้งZenity fork YAD จาก webupd8 PPAเพื่อให้สคริปต์ทำงานได้


ทำงาน greate ใน terminal! ขอขอบคุณ! ฉันต้องการ screencopy codetext จากแบบฝึกหัดสำหรับการทดสอบ จะใช้ scrot กับคลิปบอร์ดได้อย่างไร?
Erling

1
เกิดอะไรขึ้นกับเทมไฟล์
Erling

1
tempfiles จะอยู่ที่นั่นจนกว่าคุณจะรีบูทคอมพิวเตอร์ หากนั่นเป็นปัญหาสำหรับคุณคุณสามารถลบได้ในตอนท้าย ( rm $SCR_IMG.png $SCR_IMG.txt)
เซเลม

1
scrotด้วยตัวเองไม่สามารถใช้คลิปบอร์ดได้ แต่มีเครื่องมือเช่นxclipหรือxselอาจทำสิ่งที่คุณต้องการหากมันคือการคัดลอก / วางข้อความ
เซเลม

1
การเพิ่มคำตอบของ Salem: หากคุณใช้ KDE คุณสามารถเรียกสคริปต์อื่นเพื่อส่งข้อความที่คุณสร้างขึ้นไปยังคลิปบอร์ดโดยอัตโนมัติพร้อมที่จะวาง คุณจะพบสคริปต์ที่เหมาะสมที่นี่ ทำตามคำแนะนำในหน้านั้นเพื่อติดตั้งสคริปต์นั้น จากนั้นทั้งหมดที่คุณต้องมีคือการเพิ่ม| clipboardไปที่ท้ายบรรทัดสุดท้ายของสคริปต์ของ Salem
Chris

3

ไม่ทราบว่ามีใครต้องการโซลูชันของฉันหรือไม่ นี่คือหนึ่งที่ทำงานกับ Wayland

มันแสดงให้เห็นถึงการจดจำตัวละครใน Text-Editor และหากคุณเพิ่มพารามิเตอร์ "ใช่" คุณจะได้รับการแปลจากเครื่องมือการแปลงตา (การเชื่อมต่ออินเทอร์เน็ตเป็นสิ่งจำเป็น) ก่อนที่คุณจะสามารถใช้มันติดตั้ง tesseract-ocr imagemagick และ google-trans เริ่มสคริปต์เช่น gnome ด้วย Alt + F2 เมื่อคุณเห็นข้อความที่คุณต้องการจดจำ ย้ายเคอร์เซอร์ไปมาจัดเรียงข้อความ แค่นั้นแหละ. สคริปต์นี้เป็น testetd สำหรับคำพังเพยเท่านั้น สำหรับโปรแกรมจัดการหน้าต่างอื่น ๆ มันจะรองรับ หากต้องการแปลข้อความในภาษาอื่นให้แทนที่ ID ภาษาในบรรทัดที่ 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

1

ฉันเพิ่งเขียนบล็อกเกี่ยวกับวิธีใช้ภาพหน้าจอในวันที่ทันสมัย แม้ว่าฉันจะกำหนดเป้าหมายเป็นภาษาจีน แต่การส่งหน้าจอและรหัสเป็นภาษาอังกฤษ OCR เป็นเพียงหนึ่งในคุณสมบัติ

คุณสมบัติสำหรับ OCR ของฉัน:

  • เปิดใน konsole + vimx OR gedit เพื่อแก้ไขเพิ่มเติม

  • สำหรับ vimx + english เปิดใช้งานการตรวจสอบการสะกดคำ

  • รองรับการเลือกภาษาแบบไดนามิกโดยไม่มีรหัสยาก

  • กล่องโต้ตอบความคืบหน้าเมื่อการแปลงและการดำเนินการ tesseracting ช้า

รหัสฟังก์ชั่น:

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

รหัสผู้โทร:

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 &

รวมรหัส 2 นี้ในเชลล์สคริปต์เดียวเพื่อเรียกใช้

ภาพหน้าจอ 1: ป้อนคำอธิบายรูปภาพที่นี่

ภาพหน้าจอ 2: ป้อนคำอธิบายรูปภาพที่นี่


ดูเหมือนว่าจะเป็นทางออกที่ดี แต่การอ่านสคริปต์ของคุณนั้นแย่มาก
ukos

0

แนวคิดคือทุกครั้งที่มีไฟล์ภาพหน้าจอใหม่ปรากฏขึ้นในโฟลเดอร์ที่รัน tesseract OCR และเปิดในโปรแกรมแก้ไขไฟล์

คุณสามารถปล่อยให้สคริปต์การทำงานนี้อยู่ในไดเรกทอรีผลลัพธ์ของไดเรกทอรีผลลัพธ์ที่คุณชื่นชอบ

#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

คุณจะต้องการสิ่งนี้เพื่อที่จะได้รับ istalled

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.