質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

11908閲覧

OCR機能を用いて、画像内の対象文字列をクリックしたい

python01

総合スコア11

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

3グッド

4クリップ

投稿2021/02/17 07:29

編集2021/02/24 17:10

前提・実現したいこと

OCR機能を用いてアイコンをクリックする動作をさせたいです。
※下記コードのようなPyautoguiで画像をサーチする方法ではなく、
文字をサーチする方法でクリックさせたいです。

Python

1import pyautogui as pg 2position=pg.locateOnScreen('search.bmp') 3pg.click(position)

例えば、windowsのcalenderを立ち上げる場合、
下記コードでcalenderアプリを含む画像を取得し、

Python

1pg.press('win') 2sc = pg.screenshot(region=(0, 0, 500, 700))

pyocrを用いて画像内の「calender」の文字列を抽出するところまで
できました。

しかし、この文字列がある座標を取得する方法がわからない為、
クリックができないです。

知見がある方がいらっしゃいましたらご教授の程よろしくお願いします。

試したこと

・Tesseractをインストールし、pyocrで手書きの文字が正常に認識することを確認済み
・openCVをインストール済み

補足情報(FW/ツールのバージョンなど)

OS:windows10 64bit
Python:3.8.3
pip:21.0.1
opencv-python:4.5.1.48
pyocr:0.8
PyAutoGUI:0.9.52

解決方法

sakuramochi_py 様にご教授頂き、下記コードで実現できました。

Python

1import pyautogui as pg 2import time 3import cv2 4import pyautogui as pg 5 6pg.press('win') 7time.sleep(2) 8 9sc = pg.screenshot(region=(50, 100, 500, 700)) #始点x,y、幅、高さ 10sc.save('./img/img.png') 11 12lang = 'eng' 13img_path = './img/{}.png'.format(lang) 14img = Image.open(img_path) 15out_path = './img/{}_{}.png' 16 17word_boxes = tool.image_to_string( 18 img, 19 lang=lang, 20 builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6) 21) 22 23out = cv2.imread(img_path) 24 25for d in word_boxes: 26 print(d.content) 27 print(d.position) 28 cv2.rectangle(out, d.position[0], d.position[1], (0, 0, 255), 2) #d.position[0]は認識した文字の左上の座標,[1]は右下 29 cv2.imwrite(out_path.format(lang, 'word_boxes'), out) 30 x1,y1 = d.position[0] 31 x2,y2 = d.position[1] 32 if(d.content=='Anaconda3'): #Anacondaのアイコンを認識したらクリックする 33 x3 = (x1+x2)/2+50 34 y3 = (y1+y2)/2+100 35 pg.click(x3,y3)

認識した画像を確認するとこんな感じです。

イメージ説明

追記(画像処理方法と文字認識時間検証)

下記3種類の画像認識方法について、
認識画像と認識時間を追記しました。

sakuramochi_py 様の見解通り3種類の組み合わせが一番認識時間が
短い結果となりました。

①:フルカラー
②:①+グレースケール
③:②+2値化
④:③+反転

イメージ説明

Python

1img = cv2.imread("./img/eng.png") 2 3#グレースケールに変換 4gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 5cv2.imwrite("./img/eng.png",gray) 6 7#2値化 8img = cv2.imread("./img/eng.png") 9threshold = 105 10ret,img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY) 11cv2.imwrite("./img/eng.png",img_thresh) 12 13#色反転 14img = cv2.imread("./img/eng.png") 15img_invert = cv2.bitwise_not(img) 16cv2.imwrite("./img/eng.png",img_invert)
sakuramochi_py, ToshiOk, edger_arkw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

方法としては、同じくpyocrにある、pyocr.builders.LineBoxBuilderをbuilderとして使うとできるかもしれません。

手順:

Python

1#1 2res = pyocr.get_available_tools()[0].image_to_string( 3画像, 4lang = 言語, 5builder = pyocr.builders.LineBoxBuilder() 6) 7 8#2 9for d in res: 10 x1,y1 = d.position()[0] 11 x2,y2 = d.position()[1] 12#これで、文字列のまとまりを四角とした座標が取得できるので、その四角の範囲をpyocrで読み、目的の文字列であったら、その四角の座標をクリックする。などでどうでしょうか

投稿2021/02/21 06:15

sakuramochi_py

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python01

2021/02/21 07:54

ご回答ありがとうございます。 試してみます。
python01

2021/02/21 13:08

ありがとうございます。 うまく動作できました!
sakuramochi_py

2021/02/21 14:19

蛇足ですが、もう少し精度を上げたいのであれば、OpenCVを活用して、グレースケール&二値化&反転(Pyocrは黒い文字だったほうが精度が上がるため)するのがいいですよ。
python01

2021/02/21 14:30

了解です。 openCVを勉強していろいろ試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問