見出し画像

PythonでのOCR(画像からの文字抽出)

下記記事を参照にOCRを行い躓いた点、利用方法の考察、感想を記述する。
OCRの具体的な方法については本Noteでは詳細の説明はしない。


https://qiita.com/Cartelet/items/9affdd7440c218bc080d#


リンク先記事内容

ウマ娘PC版アプリにおける非公式アプリにUmaUmaCruise(C++)というプロダクトが存在する。その疑似機能をPythonで作成する方法を解説している。

上記記事を読むとどんなことができるのか
・PC操作ウィンドウから指定した位置をスクショする
・スクショ(Png、Jpeg)情報から文字情報を抽出する
・2つの文字情報の類似度を計算する(一致と判断したら特定処理を行うなどで使用する)



躓いた点

locateOnScreen関数の変数が何を意味するのか分からない
locateOnScreenはあらかじめ用意した画像ファイル(png)をもとにデスクトップ画面から画像に一致する位置座標を返してくれる関数である。

#使用例
pos = pyautogui.locateOnScreen('検索したい画像ファイル名.png', confidence=0.9)

#変数posの中身
Box(left=72, top=28, width=147, height=33)
posの中身の説明
left: デスクトップ画面の中で検索画像が存在する横位置座標
top:デスクトップ画面の中で検索画像が存在する高さ座標
width: 検索したい画像の横幅
height:検索したい画像の縦幅

例)検索したい画像

画像3

スクリーンショット 2022-01-30 105800



◆locateOnScreenで正しい位置情報が取得できない

写真をちゃんと取らないとかなり精度が低くなる
失敗画像例1

失敗

上に背景部分が入ってしまったせいかうまくいかなかった。



失敗画像例2

画像2

×ボタンなどはどのウィンドウにも存在するため特定したい位置以外を取得してしまうこともあった。(デフォルトで一番左上の一致する場所を返すよう)



cvtColorでのエラー
cvtColorは画像ファイル情報を白黒情報に変換する関数。
cvtColorはUMat型という画像データ型でないとエラーを吐いてしまう。

リンク記事ではpyautogui.screenshot関数でスクリーンショットを撮ってそのデータをcvtColorに入れているがエラーが出てしまった。
調査したところpyautogui.screenshot関数で取得したデータ型がnampy型になってしまっていた。

一度画像ファイルとしてローカル環境に保存したうえでもう一度その画像ファイルを取得するという工程を踏んだところ無事UMat型でデータ取得できた。

#スクリプト例
#スクリーンショットでの画像データ取得(nampy型)
pic = pyautogui.screenshot() 


#画像データを一時保存(保存画像名='ivent_name.png')
pic.save('ivent_name.png')


#画像データの再取得
img = cv2.imread('ivent_name.png')



get_available_tools関数でtesseractからうまく機能が呼び出せない
デフォルト状態ではtesseractとのパスがつながっていないらしい。
環境変数でtesseractとのパスを設定するか、Python内でパスを指定する必要がある。(筆者は環境変数での設定が上手くいかずPython内でパスを指定する方法を利用した。)

#スクリプト例
#pyocrからtesseractへと接続するパスの指定
#C:以降は自分のPCでのtesseractのダウンロード先を確認してパスの指定が必要
pyocr.tesseract.TESSERACT_CMD = r'C:\Program Files\Tesseract-OCR\tesseract.exe'


#パスの指定後にget_available_tools関数でtesseractの機能を呼び出す
tool = pyocr.get_available_tools()[0]




利用方法の考察

以下のような場合に利用できると感じた。
・png, jpeg情報から文字情報を読み取りたい場合
・ユーザーが動かしているPC画面から文字情報を抽出したい場合


OCRは情報の取得精度が100%ではないため他に方法があるばあいはそちらを先に試してみる方がいいだろう。


取得したい情報がpdfファイルの場合
文字情報がpdf内部に存在する場合があるのでまずはそちらを参照できないか確認する。(ワードからpdfを作成した場合など、スキャナから作成した場合は難しい)

取得したい情報がWebサイトの場合
html情報を参照した方がいい。一番簡単なhtml情報の取得はスプレッドシートのIMPORTXML関数。


感想

ウマ娘にはまり、UmaUmaCruiseというツールを使って衝撃を受けた。
ユーザーの入力操作によって動くようなツールが一般的なので、操作画面に合わせて動的に必要な情報を出しわけるという点が優れていると感じた。

そのようなことを実現するためには定期的に画面の変動がないかスクリプトを動かす必要があるだろう。下手なスクリプトだと処理が重くなってしまうため類似機能の開発を行う際には注意が必要だと感じた。

また今回の方法ではTesseractというツールをローカル環境に落とす必要がある。Pythonのスクリプトをクラウド環境などで実行したい場合はTesseract機能をどう呼び出すか工夫が必要だろう。

いいなと思ったら応援しよう!