🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2867閲覧

Swift SwiftyTesseractの文字解析結果が酷すぎる。。。(日本語解析)

globalplus

総合スコア119

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/11/12 17:26

編集2019/11/12 17:32

撮影した写真を値渡しし、tesseractを使って撮影写真に写っている日本語をUITextviewに解析し表示してみたのですが一文字も合っていなかったのでなぜなのか教えて下さい。泣
jpn.traineddataは入れてあります
よろしくお願いします

機能の手順
FirstViewController→カメラ(実装出来てます)で撮影

画面遷移(値渡し)

ImageViewController→FirstViewControllerで撮影した写真をUIImageViewに表示し解析

解析結果をUITextviewに表示(一文字も合っていない)

ImageViewController

1import UIKit 2import SwiftyTesseract 3 4class ImageViewController: UIViewController { 5   //写真表示用 6 @IBOutlet weak var picView: UIImageView! 7 //解析結果表示用 8 @IBOutlet weak var textView: UITextView! 9 let tesseract = SwiftyTesseract(language: RecognitionLanguage.japanese) 10 var resultImage: UIImage? 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 15 picView.image = resultImage 16 } 17 @IBAction func back(_ sender: Any) 18 { 19 self.dismiss(animated: true, completion: nil) 20 } 21 //解析ボタン(UIButton) 22 @IBAction func imageProcessed(_ sender: Any) 23 { 24 guard let image = resultImage else {return} 25 26 tesseract.performOCR(on: image){ recognizedString in 27 guard let text = recognizedString else {return} 28 print("(text)") 29 30 self.textView.text = text 31 } 32 }

サンプルとして解析した画像(スマホでPCの画面を撮影)イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

解決方法でなく申し訳ないですが。

僕もSwiftyTesseractを使っていますが、基本的に日本語はまともに読み取ってくれません。

おそらくほとんど役に立たないとは思いますが僕が用いている方法を紹介します。

まず前提として、
0. 手書きではなくfont固定の画像データ
0. 画像全体には絵などを含むが定型フォーマットであり文字列がどの領域(CGRect)にあるかがあらかじめわかっている
0. 読み取るべき文字列は100のオーダーのリストのうちのいずれかである

という条件が付いてます。

僕が用いている方法は
0. 画像全体ではなく文字がある領域だけを切り抜きOCRにかける
0. あらかじめ読み取り間違いと正しい文字列の対応表を作り間違った結果から正しい結果を引き出せるようにする

です。

読み取り間違いをしますが相手は機械ですのでほとんど常に同じ間違いをします。
これを利用して対応表を作り対処しています。


使ったことがないのですが Visionフレームワークに文字列領域検出機能があるのでそれを使うとちょっとはまともになるのではないでしょうか?


追記

もう一つやっている工夫がありました。
僕のやっているものでは白黒2値化してやると読み取り精度は格段に向上しました。
白黒2値化まで行かなくてもグレースケールにしただけでも精度の向上が認められました。

投稿2019/12/02 02:11

編集2019/12/03 02:27
MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

globalplus

2019/12/02 19:31

アドバイスありがとうございます。 画像データ指定ですか。。。 理想はGoogle翻訳の様にカメラをかざすと自動的に読み取ってくれる様な機能なのですが、、 ちなみにコンソールを確認すると認識する画像のサイズが小さすぎてだめ!みたいな事を出力されたので swiftytesseractに適した大きさに合わせる様な機能を付けている途中でした。 ですがまず 切り抜きをまず試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問