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

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

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

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

PyAutoGUI

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

OpenCV

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

Python

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

解決済

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

python01
python01

総合スコア5

Tesseract

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

PyAutoGUI

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

OpenCV

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

Python

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

1回答

2リアクション

4クリップ

7685閲覧

投稿2021/02/17 07:29

編集2021/02/24 17:10

前提・実現したいこと

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

Python

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

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

Python

pg.press('win') sc = 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

import pyautogui as pg import time import cv2 import pyautogui as pg pg.press('win') time.sleep(2) sc = pg.screenshot(region=(50, 100, 500, 700)) #始点x,y、幅、高さ sc.save('./img/img.png') lang = 'eng' img_path = './img/{}.png'.format(lang) img = Image.open(img_path) out_path = './img/{}_{}.png' word_boxes = tool.image_to_string( img, lang=lang, builder=pyocr.builders.WordBoxBuilder(tesseract_layout=6) ) out = cv2.imread(img_path) for d in word_boxes: print(d.content) print(d.position) cv2.rectangle(out, d.position[0], d.position[1], (0, 0, 255), 2) #d.position[0]は認識した文字の左上の座標,[1]は右下 cv2.imwrite(out_path.format(lang, 'word_boxes'), out) x1,y1 = d.position[0] x2,y2 = d.position[1] if(d.content=='Anaconda3'): #Anacondaのアイコンを認識したらクリックする x3 = (x1+x2)/2+50 y3 = (y1+y2)/2+100 pg.click(x3,y3)

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

イメージ説明

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

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

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

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

イメージ説明

Python

img = cv2.imread("./img/eng.png") #グレースケールに変換 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite("./img/eng.png",gray) #2値化 img = cv2.imread("./img/eng.png") threshold = 105 ret,img_thresh = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY) cv2.imwrite("./img/eng.png",img_thresh) #色反転 img = cv2.imread("./img/eng.png") img_invert = cv2.bitwise_not(img) cv2.imwrite("./img/eng.png",img_invert)
sakuramochi_py, ToshiOk👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Tesseract

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

PyAutoGUI

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

OpenCV

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

Python

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