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 を先にインストールする。
- The official github repository for Leptonica
- tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository)
- Tesseract OCR 3.05 のインストールと新機能 – ながいものには、まかれたくない
基本コマンド
ocr
フィルタを使うには学習データを ffmpeg と同じフォルダ内に日本語なら jpn.traineddata フォルダを作ってその中に jpn.traineddataをコピーして使う。
学習データの指定には絶対パスを指定する。
ffplay -i video -vf "ocr='D:\/ffmpeg/jpn.traineddata':language=jpn:whitelist=あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん",metadata=print:key=lavfi.ocr.text"
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 - language[string]
認識言語。List of ISO 639-2 codes – Wikipedia
既定値:eng
他の言語の指定文字一覧。日本語は jpn。アルファベット、数字記号だけなら英語でよい - whitelist[string]
認識する文字の種類。日本語はlanguageを日本語にしてもwhitelistにない文字は OCR してくれない。漢字も認識するなら 常用漢字一覧 – Wikipediaを参考にする。漢字一覧
既定値:”0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.:;,-+_!?\”‘[]{}()<>|/\\=*&%$#@!~ “ - blacklist[string]
認識させない文字の種類
既定値:””
例:datapath='D\:/ffmpeg/'