14

OpenCV を使用して、iPhone ゲームBlockedのスクリーンショットを「解析」しようとしています。スクリーンショットは次のように切り取られます。

ブロックされたスクリーンショット

今のところ、各長方形を構成する 4 つの点のそれぞれの座標を見つけようとしているだけだと思います。OpenCV に付属のサンプル ファイル squares.c を見ましたが、この画像でそのアルゴリズムを実行すると、72 個の四角形が表示されます。長方形。これにアプローチするより良い方法は何ですか? Google で調べてみましたが、すべての検索結果について、関連する有用な情報はほとんどありません。

4

6 に答える 6

16

同様の問題はすでに議論されています: この画像の四角形を認識する方法は?

データに関しては、見つけようとしている長方形だけが黒いオブジェクトです。したがって、しきい値の二値化を試みることができます。黒いピクセルは、3 つの RGB 値すべてが 40 未満のピクセルです (経験的に見つけました)。この簡単な操作で、写真は次のようになります。

二値化画像

その後、ハフ変換を適用して行を見つけることができます (私が参照したトピックで説明しました)、またはより簡単に行うことができます。黒のピクセルの X 軸と Y 軸への積分射影を計算します。(X への射影は、x_i のベクトルです。最初の座標が x_i に等しいような黒のピクセルの数です)。したがって、投影のピークとして可能な x 値と y 値を取得します。次に、見つかった x と y によって制限される可能性のあるすべてのセグメントを調べます ((x_i, y_j) と (x_i, y_k) の間に多くの黒いピクセルがある場合は、おそらく線がある可能性があります)。最後に、線分を長方形に構成します。

于 2010-01-15T16:05:53.100 に答える
7

私は元の方法に基づいて構築し、ロバートが私の質問に対するコメントで提案したようにしました。長方形のリストを取得したら、各長方形の平均色を計算します。平均色の赤、緑、青の成分がそれぞれ灰色と青の四角形の色の 10% 以内にあるかどうかを確認し、そうであれば四角形を保存し、そうでない場合は破棄します。このプロセスにより、次のような結果が得られます。

スクリーンショット

これから、必要な情報 (ゲーム ウィンドウを 6x6 グリッドと見なして、各長方形の方向、開始点、および長さ) を取得するのは簡単です。

于 2010-01-15T22:47:27.423 に答える
5

これが完全な Python ソリューションです。主なアイデアは次のとおりです。


これは、検出された各長方形の輪郭の視覚化です

ここに画像の説明を入力

結果

ここに画像の説明を入力

import cv2

image = cv2.imread('1.png')
blur = cv2.pyrMeanShiftFiltering(image, 11, 21)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.015 * peri, True)
    if len(approx) == 4:
        x,y,w,h = cv2.boundingRect(approx)
        cv2.rectangle(image,(x,y),(x+w,y+h),(36,255,12),2)

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()
于 2019-10-03T01:48:07.940 に答える
3

ブロックはビットマップのように見えます。ブロックのサイズ/色/向きごとに異なるテンプレートを使用して単純なテンプレート マッチングを使用してみませんか?

于 2010-01-15T16:04:45.410 に答える
2

あなたの問題は小さな長方形であるため、それらを削除することから始めます。これらの線は長方形の境界線よりもはるかに細いため、画像に形態学的操作を適用することから始めます。

次のような構造要素を使用します。

 element = [ 1 1
             1 1 ]

幅が 2 ピクセル未満の行を削除する必要があります。小さな線が削除された後、OpenCV の四角形検索アルゴリズムが残りの作業を行う可能性が高くなります。侵食は関数によってOpenCVで行うことができますcvErode

于 2010-01-15T10:15:27.837 に答える
0

ハリスコーナー検出器のような多くのコーナー検出器の1つを試してください。また、一般的には、複数の解像度で試してみることをお勧めします。さまざまな倍率の前処理を行ってください。ある種の色が支配的な正方形が必要なようです。最初にcvsplitのようなものを使用し、次に色をしきい値処理することで、他の色を抑制できます。そのため、その領域のみが残ります。トリミング操作...それもうまくいくと思います...。

于 2010-01-15T08:23:54.557 に答える