前提・実現したいこと
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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/21 07:54
2021/02/21 13:08
2021/02/21 13:50
2021/02/21 14:19
2021/02/21 14:30
2021/02/21 14:37