[Python] 306 pyocr 文字認識によるブラウザの文字読み取り

[macOS Catalina 10.15.7]

pyocrを使ってブラウザの文字を読み取りました。

今回はurl欄のurlを取得しました。この方法で動画サイトのチャンネル名などをスクリーンショットから文字データにできます。

Google Chromeのurlはドメイン名から右部分がグレイアウトしているため、コントラストを上げて文字を少し横長にしさらにtesseract_layoutの設定を調整しました。なかなか正確な文字起こしができず、時間が掛かりました。

設定が合わないと実際からは程遠い文字列になりますが、フィットする設定になると突然正しく認識します。最適解に近づいているのかどうか分かりにくいのが難点です。

様々なチャンネル名で検証した結果、コントラストは1.5倍、画像は縦横それぞれ5倍、5.5倍に拡大、tesseract_layoutは設定6にして何とか読み取れるようになりました(ディスプレイはフルHD)。あくまでも仮設定です。4Kディスプレイであれば拡大しなくて済むかもしれません。

pip install pyocr
brew install tesseract
import pyautogui as gui
import pyocr
import pyocr.builders
from PIL import Image
from PIL import ImageEnhance

tools = pyocr.get_available_tools()
tool = tools[0]
print(f"tool {tool.get_name()}")

# ドメイン名の座標を取得
ret = gui.locateCenterOnScreen("url.png", confidence=.8)
gui.moveTo(ret) # urlへのカーソル移動を確認

# スクリーンショットの左上座標を算出
x1 = ret.x + 34
y1 = ret.y - 10
print(f"x1:{x1} y1:{y1}")

# スクリーンショットのサイズを設定
width = 200
height = 20

img = 'img.png'
img_con_enh = 'img2.png'

# スクリーンショットを撮る
sc = gui.screenshot(region=(x1, y1, width, height))
sc.save(img)

# 得られた画像のコントラストを1.5倍、サイズを縦5倍横5.5倍に拡大する
img_open = Image.open(img)
img_con = ImageEnhance.Contrast(img_open)
img_con_enh_open = img_con.enhance(1.5)
img_con_enh_open2 = img_con_enh_open.resize((1100,100))
img_con_enh_open2.save(img_con_enh)

# 画像から設定6で文字認識し文字データへ変換
txt = tool.image_to_string(
        Image.open(img_con_enh),
        lang="eng",
        builder=pyocr.builders.TextBuilder(tesseract_layout=6))

print(txt)