質問: 現在、OpenCVでとあるゲームのスクリーンショットを元に解析をしているのですが、あるマークがうまく検出できずに困っています。使用しているOpenCVは3.4.2で、Python3でスクリプトを書いています。 この問題は対象の画像に依存する部分が大きいため、実際に解析している画像を貼らせていただきます。 ![cards.jpg](https://i.stack.imgur.com/wqraN.jpg) この画像を解析しているですが、カード一枚毎が大まかにどの座標に描画されているか知りたいです。 そのため、カードの切れ目に特徴点な点としてカード左上部の緑の丸の部分に注目しました。 この緑丸の座標がわかれば、緑丸毎の間隔でカード一枚毎の座標がわかるからです。 そこで以下のような緑丸だけの画像を用意しました。 ![緑丸](https://i.stack.imgur.com/2Xr9Y.png) そしてこれを元に、テンプレートマッチングや特徴点抽出を行いましたが、うまくいきませんでした。 そこで円を検出するアプローチに変更し、HoughCirclesを使い引数などを色々と変更しましたが、うまく緑丸の部分を検出できませんでした。 どのようにすれば、緑丸を認識することができるでしょうか?またはカード毎の座標がわかるでしょうか? ご回答いただけると助かります。
回答: 手元のpython3.6環境で緑丸の外周の深緑を抽出(※1)してHoughCirclesを使ったところ、円の座標を抽出(※2)できました。 緑丸の画像は数値の有無でマッチングが難しいので、1..5の数値が入った緑丸の画像を用意する方法が最も確実だと思いますが、下記のような対応も検討してみてはいかがでしょうか。 ``` import cv2 import numpy as np img = cv2.imread(r'フルパス]\wqraN.jpg') # HSVに変換 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 緑のHSV範囲(閾値を変えたい場合は下記の範囲を変更すること) lower = np.array([0x29,0xa3,0x70]) upper = np.array([0x49,0xff,0xa0]) # 緑以外にマスク mask = cv2.inRange(hsv, lower, upper) res = cv2.bitwise_and(img, img, mask= mask) # グレースケール化して判定 cimg = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY) # 円の精度を高めたい場合はparam2の値を大きくする circles = cv2.HoughCircles(cimg, cv2.HOUGH_GRADIENT,2,20, param1=50,param2=100,minRadius=20,maxRadius=0) circles = np.uint16(np.around(circles)) #描画 for i in circles[0,:]: cv2.circle(res,(i[0],i[1]),i[2],(0,0,255),2) print("x={},y={}".format(i[0], i[1])) # 表示 cv2.imshow('HoughCircles',res) cv2.waitKey(0) cv2.destroyAllWindows() ``` ※1 緑丸の外周の深緑を抽出 ![緑丸の外周の深緑を抽出 ※2 円の座標を抽出 !円の座標を抽出