Tesseract-OCRを使ったocrフィルタで文字認証を行う。ffmpegにはlibtesseractを有効化する。本家と同様に英語や日本語などたくさんの言語に対応している。ただし日本語の漢字の精度はかなりよくない。2018年10月にリリースした 4.0 でひらがなとカタカナの識字率はかなり上がった。ただし漢字は似た漢字になる場合も多い。
以下の wiki によると、識字率は OCR する前に対象文字周辺をcropフィルタで切り取ると上がるが文字周辺ギリギリはよくない。また解像度が小さすぎても大きすぎても識字率は下がることがある。

識字率を上げる方法

Improving the quality of the output | tessdocより

  • 少なくとも300dpi以上
  • 2色グレースケール化
  • ノイズ削除
  • 傾いている文字を補正
  • スキャンしたとき外枠やページとページの間の黒くなっている部分をカット

3系統の日本語、中国語の効果的な設定。最新版の4系統は不明。
ControlParams · tesseract-ocr/tesseract Wiki · GitHub : web.archive

Tesseract-OCR 3.04 を試してみる – ながいものには、まかれたくない
Tesseract.Net parameters – archive.org

x:y は出力解像度。横:縦
w:h は出力解像度の左上隅の座標。横:縦
映像を指定座標に切り取る crop
crop=x:y:w:h,ocr

インストール

tesseract をインストールする前に leptonica を先にインストールする。

基本コマンド

ocrフィルタを使うには学習データを ffmpeg と同じフォルダ内に日本語なら jpn.traineddata フォルダを作ってその中に jpn.traineddataをコピーして使う。

学習データの指定には絶対パスを指定する。
ffplay -i video -vf "ocr='D:\/ffmpeg/jpn.traineddata':language=jpn:whitelist=あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん",metadata=print:key=lavfi.ocr.text"

ffprobe の使い方

img.png に書いてある英語を OCR し、コンソールに表示する。
ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=img.png,ocr"

日本語のひらがなとカタカナを OCR し、コンソールに表示する。漢字も OCR するならwhitelistに一覧を追加する。
ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=img.png,ocr='D\:/ffmpeg/':language=jpn:whitelist=あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワオンぁぃぅぇぉァィゥェォゃゅょャュォがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽガギグゲゴザジズゼゾダチヅデドバビブベボパピプペポー~、。"

日本語の画像サンプル

動画ファイルを再生しながら OCR し、コンソールに表示する。
ffplay -i input -vf ocr,metadata=print:key=lavfi.ocr.text

fileを使えばテキストに出力できる。
ffmpeg -i input -vf ocr,metadata=mode=print:file=foo.txt -an -f null -

dshow 入力した映像(SCFF DirectShow Filter)に OCR し、コンソールに表示する。1フレームではないのでフレーム毎に OCR すれば結果がコンソールに表示される。ウェブカメラも取り込めるのでレシートなどの数字やカタカナも読み込める。
ffplay -rtbufsize 10MB -f dshow -video_size 640x360 -framerate 30 -i video="SCFF DirectShow Filter" -vf ocr,metadata=print:key=lavfi.ocr.text

OCR の背景が単色の場合。cropフィルタで座標 758:334 の 31x24p で切り取り、1度目のcolorchannelmixerでモノクロにし、2度目で80以上を255にする2色に変え、xbrで2倍に拡大し、sabでデノイズしている。
ffprobe -show_entries frame_tags=lavfi.ocr.text -f lavfi -i "movie=img.png,crop=31:24:758:334,colorchannelmixer=.299:.587:.114:0:.299:.587:.114:0:.299:.587:.114:0,colorchannelmixer=.3:.59:.11:0:.3:.59:.11:0:.3:.59:.11:0,lutrgb='between(val,80,255)*255:between(val,80,255)*255:between(val,80,255)*255',xbr=2,sab,ocr=eng.traineddata:eng" -show_entries frame_tags=lavfi.ocr.text -of csv > output.csv

ffmpeg 4.2 からはlavfi.ocr.confidenceが使え、 フレーム毎に1文字ずつの OCR 結果の信頼性を0から100までの数値で調べることも出来る。高ければ信頼性が高いが、0になったからといって常に間違いとも限らない。
ffprobe -f lavfi -i "movie=img.png,ocr" -show_entries frame_tags=lavfi.ocr.confidence,lavfi.ocr.text

公式ドキュメント:FFmpeg Filters Documentation : ocr

オプション

  • datapath[string]
    学習データのフォルダの指定。モデルファイルまで指定してはいけない。インストールPCと実行PCが異なる場合は指定しないとエラーになるかもしれない。相対パスだとエラーが出るので絶対パスで指定する
    既定値:インストールしたときに TESSDATA_PREFIX で指定したところ
    学習データの配布先:eng, jpn
  • 例:datapath='D\:/ffmpeg/'

  • language[string]
    認識言語。List of ISO 639-2 codes – Wikipedia
    既定値:eng
    他の言語の指定文字一覧。日本語は jpn。アルファベット、数字記号だけなら英語でよい
  • whitelist[string]
    認識する文字の種類。日本語はlanguageを日本語にしてもwhitelistにない文字は OCR してくれない。漢字も認識するなら 常用漢字一覧 – Wikipediaを参考にする。漢字一覧
    既定値:”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.:;,-+_!?\”‘[]{}()<>|/\\=*&%$#@!~ “
  • blacklist[string]
    認識させない文字の種類
    既定値:””

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)