docomoの文字認識APIを使って画像から文字を抽出

#やりたいこと
docomoのAPIを使って画像から文字を抽出したい。

**追記(2016/02/16)**
GitHubにプログラムをアップしました。→ [source](https://github.com/ichiroex/characterRecognition)

#事前準備
- docomo Developer supportに登録してAPI keyを取得する。
 - [docomo Developer support](https://dev.smt.docomo.ne.jp/?p=index)
- 認識したい画像ファイルを用意 (JPEG形式)
- 詳しくはリファレンスを参照
 - [リファレンス](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=character_recognition&p_name=api_reference#tag01)

#認識する画像ファイル (test.jpg)
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/92685/997d0a1f-0c8a-f58f-56a7-36aa7fb2347d.jpeg)

#開発環境
- python 2.7系

#プログラム
```lang:characterRecognition.py
#coding: utf-8
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import urllib2
import json
import time 
import urllib
import re
import sys

#画像データを投げて、画像のIDをjson形式で取得 (情景画像認識要求)
def getImageID(fname):
    register_openers()
    url = 'https://api.apigw.smt.docomo.ne.jp/characterRecognition/v1/document?APIKEY=(API keyを入力して下さい)'
    
    f = open(fname, 'r')

    datagen, headers = multipart_encode({"image": f, 'lang': 'jpn'})
    request = urllib2.Request(url,datagen, headers)
    response = urllib2.urlopen(request)
    
    res_dat = response.read()
    return json.loads(res_dat)['job']['@id'] #画像のIDを返す

#取得したjsonから単語だけを取り出す。
def makeWordList(result):
    
    word_list = []
    count  = int(result['lines']['@count'])

    for i in range(count):
        word = result['lines']['line'][i]['@text']
        word_list.append(word)

    return word_list

#情景画像認識結果取得
def getWordList(img_id):

    register_openers()
    url = 'https://api.apigw.smt.docomo.ne.jp/characterRecognition/v1/document/' + img_id + '?APIKEY=(API keyを入力して下さい)'
    
    request = urllib2.Request(url)
    
    recog_result = {}
    for i in range(5):
        response = urllib2.urlopen(request)
        res_dat = response.read()
        
        recog_result = json.loads(res_dat)
        
        status = recog_result['job']['@status']
        
        if status == 'queue':
            print '受付中...'
        elif status == 'process':
            print '認識処理中...'
        elif status == 'success':
            print '認識成功' #, recog_result
            word_list = makeWordList(recog_result)
            return word_list
        elif status == 'failure':
            print '認識失敗'
            return None

        time.sleep(3) #ちょっと待つ



if __name__ == '__main__':
    
    #画像IDを取得
    img_id = getImageID(sys.argv[1])
    
    #単語リストを取得
    word_list = getWordList(img_id)
    
    #認識した文字列を表示
    for word in word_list:
        print word

```
#実行結果
```
>python characterRecognition.py test.jpg
認識処理中...
認識成功
文字認識のテスト
```

#補足(取得したjsonの例)
```
{
  "job": {
    "@status": "success",
    "@id": "(画像ID)", #画像のID
    "@queue-time": "2016/02/13 17:03:07"
  },
  "lines": {
    "line": [
      {
        "@text": "\u6587\u5b57\u8a8d\u8b58\u306e\u30c6\u30b9\u30c8", #認識した文字列
        "shape": {
          "@count": "4",
          "point": [       #文字の画像上の座標 (左上、左下、右下、右上)
            {
              "@x": "35",
              "@y": "33"
            },
            {
              "@x": "35",
              "@y": "67"
            },
            {
              "@x": "293",
              "@y": "67"
            },
            {
              "@x": "293",
              "@y": "33"
            }
          ]
        }
      }
    ],
    "@count": "1"
  },
  "message": null
}
```

#あとがき
とりあえずメモ用に書いてみました。
詳しく知りたい方はコメントをお待ちしています。