質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3696閲覧

pythonを用いたリアルタイム文字認識

daiking119

総合スコア6

Tesseract

Tesseractは、Googleが提供しているオープンソースのOCRエンジンです。機械学習があり60以上の言語に対応でき、日本語の文字認識も可能です。さらに精度を上げることもできます。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/29 04:05

編集2019/07/29 05:16

前提・実現したいこと

pythonを初めてもちいて,tesseract,opencvでwebカメラを用いてリアルタイムにocrを行うシステムを作っています。

発生している問題・エラーメッセージ

処理が非常に重たくて,使い物になりません

該当のソースコード

python

1 2import cv2 3import numpy as np 4import os 5import datetime 6from PIL import Image 7import sys 8import pyocr 9import pyocr.builders 10 11current = os.getcwd() 12now = datetime.datetime.now() 13dir_name = "\IMG_{0:%m%d%H%M}".format(now) 14if os.path.isdir(current + dir_name) == False: 15 os.mkdir(current + dir_name) #make directory 16os.chdir(current + dir_name) #move to directory 17 18cap = cv2.VideoCapture(0) 19cap.set(cv2.CAP_PROP_FPS, 30) 20 21count = 1 22 23tools = pyocr.get_available_tools() 24if len(tools) == 0: 25 26 print("No OCR tool found") 27 sys.exit(1) 28tool = tools[0] 29print("Will use tool '%s'" % (tool.get_name())) 30 31langs = tool.get_available_languages() 32print("Available languages: %s" % ", ".join(langs)) 33 34 35while True: 36 ret, frame = cap.read() 37 w, h = frame.shape[0] , frame.shape[1] 38 39 cv2.imshow('Raw Frame', frame) 40 41  blur = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 42 ret,g_frame = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 43 44 cv2.imshow('Edited Frame', g_frame) 45 46 filename = "IMG_{}.png".format(count) 47 cv2.imwrite(filename, g_frame) 48 txt = tool.image_to_string( 49 Image.open(filename), 50 lang='jpn', 51 builder=pyocr.builders.TextBuilder(tesseract_layout=6) 52 ) 53 54 str_list = list(txt) 55 56 find = [] 57 58 for str in str_list: 59 if str == "ー": 60 str = "1" 61 find.append(str) 62 63 str_changed = "".join(find) 64 print(str_changed) 65 count += 1 66 67 68 k = cv2.waitKey(1) 69 if k == 27: 70 break 71 72 73cap.release() 74cv2.destroyAllWindows() 75 76print("完了")

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

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

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

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

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

y_waiwai

2019/07/29 04:10

しつもんはなんでしょうか また、 このままではコードが見れないので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
daiking119

2019/07/29 05:20 編集

ご指摘ありがとうございます 質問内容としましては,どのようにすれば処理が速くなるのかをお伺いしたいです。 まだ使い方を理解しきれていないため,不備などがございましたら, その都度,ご指摘お願いします
tiitoi

2019/07/29 05:28 編集

毎フレーム cv2.imwrite でフレームを保存して、再度読み込んでいるのは、重たい原因の1つだと思いますがいかがでしょうか image_to_string() は PIL.Image オブジェクトを渡せばいいので、一旦ファイルに保存する必要はないです。
daiking119

2019/07/29 05:35 編集

すみません どの部分をどのようにすればよいかを,もっと具体的に教えていただきたいです tesseractは,初めて触るので また,python自体もあまり触りなれていません お手数おかけして申し訳ないです
tiitoi

2019/07/29 05:41

回答に書きました。動作確認はしていないので、動かなかったら教えてください。
guest

回答1

0

どの部分をどのようにすればよいかを,もっと具体的に教えていただきたいです

「numpy 配列形式の画像をファイルに保存 -> Pillow でファイルから読み込み」となっている部分を、「numpy 配列形式の画像をファイルに保存 -> PIL.Image」オブジェクトに変換とすることで、ディスクの I/O をせずに済むので、多少は高速化できると思います。

PIL.Image.fromarray() で numpy 形式の画像を PIL.Image オブジェクトに変換できます。

変更範囲

python

1cv2.imshow("Edited Frame", g_frame) 2 3filename = "IMG_{}.png".format(count) 4cv2.imwrite(filename, g_frame) 5txt = tool.image_to_string( 6 Image.open(filename), 7 lang="jpn", 8 builder=pyocr.builders.TextBuilder(tesseract_layout=6), 9)

変更前

python

1txt = tool.image_to_string( 2 Image.fromarray(g_frame), 3 lang="jpn", 4 builder=pyocr.builders.TextBuilder(tesseract_layout=6), 5)

変更後

追記

だいたい5秒に一度ほどの処理でもよいので,そこのところも改善できませんか?

count 変数にフレーム数をカウントしているのであれば、5秒に1回だけ検出を実行する場合、count % 150 == 0 のときは検出、それ以外は continue すればよいです。

python

1ret, frame = cap.read()

変更前

python

1ret, frame = cap.read() 2if count % (30 * 5) != 0: 3 # 150フレームに1回だけ検出する。(30FPSなので、つまり5秒に1回) 4 count += 1 5 continue

変更後

投稿2019/07/29 05:40

編集2019/07/29 06:04
tiitoi

総合スコア21956

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

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

daiking119

2019/07/29 05:54

変更してみましたが,あまり処理速度の変化は見られませんでした これは,毎フレーム処理しているからなのでしょうか? だいたい5秒に一度ほどの処理でもよいので,そこのところも改善できませんか?
tiitoi

2019/07/29 06:05

追記しました。 count が150で割り切れないときは continue すればよいです。
daiking119

2019/07/29 06:16

ありがとうございます ためしてみたのですが,処理速度に変化は見られませんでした こうなると原因はPCのスペックなどによるものですかね?
tiitoi

2019/07/29 06:32 編集

処理速度はどのように測られてるのでしょうか? > こうなると原因はPCのスペックなどによるものですかね? 参考までにスペックを質問欄に追記していただけますか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問