【Python】tesseractとOpencvを使ってOCR試そうと思ったらハマった

目次

軽い気持ちでPythonだ!と思ったらハマった

自分で使う用の基幹業務アプリを作る一環で「名刺情報を画像から取り込めるようにしよう!」と思い立ち、Pythonの勉強も兼ねてtesseractとOpencvを使ってみた。

【環境】

参考:https://qiita.com/m-sakano/items/85f7357f611d42311da4

パッケージ認識しない

import pyocr

参考通りに進めていくと上記のようにimportする箇所があるのだが、pip installしても認識されなかった。

pip install python-opencv -t (プロジェクトまでのパス)/venv/Lib/site-package/

上記のようにinstall場所をプロジェクト内のsite-package内に指定してやると認識されるようになった。

指定しないとグローバル側のsite-package内にinstallされてたぽい。

tesseractを認識しない

# encoding=utf-8
from PIL import Image
import sys

import pyocr
import pyocr.builders
import cv2
import argparse

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]
print("Will use tool '%s"'' % (tool.get_name()))
# Ex; WIll use tool 'libtesseract'

上記のような参考コードがpyocrにあり、環境から使用するOCRツールを見つけてきて一番最初にヒットしたツールを表示する。

この場合にtesseractを認識しないという現象に陥った。

環境変数(Path)にtesserctのexeが存在するフォルダを指定しなければいけないのだが、指定しても読み込まれない。。。

結局一度pyCharmを落として、もう一度起動すると読み込まれるようになった。

どっかでキャッシュされてるのかなー

ちなみにPathはグローバル・ローカルのどちらの環境変数も読み込んでいたのでどちらに定義しても大丈夫そう。

デバッグありがとう。

pyocrで画像から文字を読込むところで-psmエラー

txt = tool.image_to_string(
  im1,
  lang=lang,
  builder=pyocr.builders.TextBuilder(tesseract_layout=6)
)
print(txt)

ようやくOCR試せるとおもったら、「-psmなんて引数はないッ!!」って怒られた。

使っているtesseractがBeta版なので、今までのと何か違うのかなー?と思いpyocr.builders.TextBuilderの中に入ってみると

def __init__(self, tesseract_layout=3, cuneiform_dotmatrix=False,
             cuneiform_fax=False, cuneiform_singlecolumn=False):
    file_ext = ["txt"]
    tess_flags = ["-psm", str(tesseract_layout)]
    cun_args = ["-f", "text"]

いた、-psm

ここら辺の引数がなくなったのかなと思い、以下の様にコメントアウトしてブランクにすると動いた。

tess_flags = ""#["-psm", str(tesseract_layout)]

デバッグありがとう。てかコード書き換えられるのか。。。

デバッグが役に立つ

Python触ってみて思ったのは、ライブラリ内でのエラーはデバッグしてけばどうなってるかは当たりがつきやすいなーと思った。

OCRあたりは初めて使ってみたけど結構認識してくれる。

もうちょい精度良くなるように学習関連にも手を出してみよう。