あちこち写経しながらですが、openCVを使い画面上に画像ファイルと一致する画像があるか調べるコードを作りました。
画像ファイルと一致する画像があれば、その座標を返す。また、画像の類似度の閾値を引数で渡せるようにしてあります。
普通の画像はファイルがBMPでもJPGでも問題なく動きます。
しかし、100×100ほどの黒一色ベタ塗りの四角の画像のファイルを作ったのですが判定できません。
画面上にそういう黒い塊を表示させるまでもなく、そういう画像が存在すると判定されてしまいます。
画像の閾値をthreshold=1.0としても、どうも画像の完全一致検索にはなってないみたいです。
それと、色の違いを認識できているのか………
画面上に100x100くらいの黒い画像が表示されたときに、分かるようにしたいのですが……。
完全画像一致にする方法とか、色の違いをきちんと認識させる方法とか、なにかの方法で黒一色の画像を認識出来るようになると嬉しいです。
よろしくお願いします。
作った画像識別コードImgcheckは以下の通りです。
Python
1import cv2 2import numpy as np 3from PIL import ImageGrab 4 5 6# OpenCVのcv2.imreadは日本語がつかえないなので画像をimedecodeでメモリに一度読み込む 7def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): 8 try: 9 n = np.fromfile(filename, dtype) 10 img2 = cv2.imdecode(n, flags) 11 return img2 12 except Exception as e: 13 print(e) 14 return None 15 16 17def chkimg(image, imgminx=0, imgminy=0, imgmaxx=0, imgmaxy=0, threshold=0.9, method=1, equalizeHist=0, gray =0): 18 if imgminx == imgminy == imgmaxx == imgmaxy == 0: 19 imgtemp = ImageGrab.grab() 20 21 else: 22 imgtemp = ImageGrab.grab((imgminx, imgminy, imgmaxx, imgmaxy)) 23 24 Screencap = np.asarray(imgtemp) 25 26 # カラー変換 27 Screenimg = cv2.cvtColor(Screencap, cv2.COLOR_RGB2BGR) 28 if gray ==1: 29 Screenimg = cv2.cvtColor(Screencap, cv2.COLOR_BGR2GRAY) 30 31 # temp = cv2.imread(finalname, 0) 32 #モノクロオプション削除 33 34 temp = imread(image) 35 if gray ==1: 36 temp = imread(image, 0) 37 38 if equalizeHist==1: 39 Screenimg = cv2.equalizeHist(Screenimg) 40 temp =cv2.equalizeHist(temp) 41 42 43 # 画像比較法 44 methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR', 45 'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'] 46 47 # マッチングテンプレートを実行 48 # print(methods[method]) 49 Comp_result = cv2.matchTemplate(Screenimg, temp, eval(methods[method])) 50 51 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(Comp_result) 52 # max_valが類似最大値の左上座標 53 54 if max_val < threshold: 55 # print(image + " 一致せず", methods[method],"equalizeHist=",equalizeHist) 56 print(image + " 一致せず") 57 return (0) 58 if max_val >= threshold: 59 print(max_loc) 60 return (max_loc) 61

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/29 08:18
2019/07/29 08:40
2019/07/29 08:43
2019/07/29 08:51
2019/07/30 09:12 編集
2019/07/30 09:10 編集
2019/07/30 09:20
2019/07/30 09:24
2019/07/30 09:33
2019/07/30 09:48 編集