1

次の図のような単純な画像キャプチャを読み取るには、Python用のキャプチャデコーダが必要です。

キャプチャ

シンプルなキャプチャ

キャプチャ

このキャプチャを読むのに役立つライブラリを知っていますか?

キャプチャを読むためのライブラリを知らない場合は、PILでこれ(およびこのような他の人)を読むのを手伝ってもらえますか?

4

3 に答える 3

5

このキャプチャがどこにも使用されていないことを願っています。

以下はそれをデコードするためのダミーの方法です。基本的に必要なのは、これらのキャプチャに存在する0から9までのパターンです。あなたの例から、私は0 3 4 5 7 8のパターンしか持っていません。すべてがそれらに固定されているので、各文字をどこで分割するかがわかります。また、各文字は固定サイズと固定フォントの数であることも知っています。文字またはそれ以上の文字が含まれているが、サイズとフォントが固定されている場合は、次のコードを簡単に適合させることができます。

コードの機能は次のとおりです。a)パターンをロードします(n0.png、n1.png、...という名前だと思います)。b)キャプチャをNUMS個に分割します。c)各パターンと各分割数の差の2乗の合計を実行します。d)分割数が最小の合計を持つものであると決定します。キャプチャに存在する各番号のリストを順番に返します。初期パターンを取得するには、分割番号を保存している行のコメントを解除し、returnその部分の後に配置して、ファイル名を調整します。

import sys
from PIL import Image, ImageOps

PAT_SIZE = (8, 10)
NUMS = 3
FIRST_NUM_OFFSET = 5
NUM_OFFSET = (1, 3)


NUMBERS = []
for i in xrange(10):
    try:
        NUMBERS.append(Image.open('n%d.png' % i).load())
    except IOError:
        print "I do not know the pattern for the number %d." % i
        NUMBERS.append(None)


def magic(fname):
    captcha = ImageOps.grayscale(Image.open(fname))
    im = captcha.load()

    # Split numbers
    num = []
    for n in xrange(NUMS):
        x1, y1 = (FIRST_NUM_OFFSET + n * (NUM_OFFSET[0] + PAT_SIZE[0]),
                NUM_OFFSET[1])
        num.append(captcha.crop((x1, y1, x1 + PAT_SIZE[0], y1 + PAT_SIZE[1])))

    # If you want to save the split numbers:
    #for i, n in enumerate(num):
    #    n.save('%d.png' % i)

    def sqdiff(a, b):
        if None in (a, b): # XXX This is here just to handle missing pattern.
            return float('inf')

        d = 0
        for x in xrange(PAT_SIZE[0]):
            for y in xrange(PAT_SIZE[1]):
                d += (a[x, y] - b[x, y]) ** 2
        return d

    # Calculate a dummy sum of squared differences between the patterns
    # and each number. We assume the smallest diff is the number in the
    # "captcha".
    result = []
    for n in num:
        n_sqdiff = [(sqdiff(p, n.load()), i) for i, p in enumerate(NUMBERS)]
        result.append(min(n_sqdiff)[1])
    return result

print magic(sys.argv[1])
于 2012-12-02T00:23:23.020 に答える
1

誠意を持って使用しており、誰かに危害を加えたり(/スパムしたり)しないことを願っています。

スクリプトを作成したり、外部プラグインに転送したりすることはありません。しかし、これを自分で書いている場合、これは役立つかもしれません:

  • 特定のキャプチャパターンをデコードしようとしている場合は、すべての文字を収集する必要があります(添付した例から、数字のみであるため、多くの作業を行う必要はないことがわかりました)。
  • すべての文字を1つのファイルに入れ、PILで分析します
  • 各文字、その位置、およびその意味を配列に保存します。
  • キャプチャ画像を取得する-必要に応じて、バックグラウンドノイズをクリアします。
  • キャプチャ画像を文字サイズに分割し、自作の文字辞書と交差させます。
于 2012-12-01T22:27:31.177 に答える
0

アカデミックな理由でやるのはいいプロジェクトです。少し前に興味がありました。いくつかのオプションがあります。

  1. あなたはこのサイトの助けを借りてあなた自身を書きます:[スクラブされたデッドリンク]

  2. OpenCVを使用してマッチングを行います。

ニューラルネットワークの画像マッチング専用のライブラリがあったと思うが、私はそれを見つけることができないようです。

基本的に、他の人が言ったように、ノイズを取り除き、単一の文字に分割し、選択した手法を使用してモデルの文字と比較します。

于 2012-12-02T01:14:12.343 に答える