4

検出する必要がある画像は次のとおりです: http://s13.postimg.org/wt8qxoco3/image.png

これが base64 表現です: http://pastebin.com/raw.php?i=TZQUieWe

私があなたの助けを求めている理由は、これが複雑な問題であり、私にはそれを解決する準備ができていないからです. 一人でやると1週間くらいかかりそう。

私が考えたいくつかの疑似コード:

1) アプリのスクリーンショットを撮り、画像オブジェクトとして保存します。

2) 画像の binary64 表現を画像オブジェクトに変換します。

3) ある種のアルゴリズム/関数を使用して、両方の画像オブジェクトを比較します。

画面上とは、アプリ内を意味します。アプリのウィンドウ名と PID があります。

100% 明確にするためには、基本的に image1 が image2 内にあるかどうかを検出する必要があります。image1 は OP で指定した画像です。image2 はウィンドウのスクリーンショットです。

4

3 に答える 3

3

これを細かく分解すると、どれも非常にシンプルです。

まず、ピクセルの 2D 配列としてアプリのウィンドウのスクリーンショットが必要です。プラットフォーム固有の方法でこれを行うにはさまざまな方法がありますが、使用しているプラ​​ットフォームについては言及していませんでした。そのため、 PILを使用して画面全体を取得しましょう。

screenshot = ImageGrab.grab()
haystack = screenshot.load()

次に、base64 をイメージに変換する必要があります。ざっと見てみると、明らかに単なるエンコードされた PNG ファイルです。そう:

decoded = data.decode('base64')
f = cStringIO.StringIO(decoded)
image = Image.open(f)
needle = image.load()

ピクセルの 2D 配列を取得したので、それが別の 2D 配列に存在するかどうかを確認します。これを行うためのより高速な方法があります (使用するnumpyのがおそらく最適です) が、理解するのがはるかに簡単な愚かな力ずくの方法もあります: haystack;の行を反復するだけです。それぞれについて、列を繰り返し、 の最初の行に一致する一連のバイトが見つかるかどうかを確認しますneedle。その場合は、 をすべて終了するまで残りの行を読み続けますneedle。その場合は を返しTrueます。不一致を見つけた場合はcontinue、次の行からやり直すだけです。

于 2013-03-29T19:14:16.980 に答える
1

これはおそらく開始するのに最適な場所です。

http://effbot.org/imagingbook/image.htm

画像のメタデータ、ファイル名、タイプなどにアクセスできない場合、やろうとしていることは非常に困難ですが、疑似サウンドは適切です。基本的に、写真の形状、線、サイズ、色などに基づいてアルゴリズム モデルを作成する必要があります。次に、そのモデルを、既に作成され、データベースでインデックス化されているモデルと照合する必要があります。それが役立つことを願っています。

于 2013-03-29T18:51:46.130 に答える
0

https://python-pillow.org/は PIL の最新バージョンのようです。

于 2016-11-09T19:20:50.227 に答える