OpenCVやOCRなどのライブラリを使用して画像処理を行う場合、アプリケーションを終了せずに入力画像や動画フレームを動的に差し替えられたら、デバッグ作業の効率が格段に向上します。
CUI形式でも入力ファイルのフォーマットを工夫することや、ユーザからの入力待ち状態を設けることで入力画像の差し替え自体は可能ですが、入力画像に対して実行する操作の量が増えてくるほど、コマンドラインが煩雑になり、作業効率がかえって下がる恐れがあります。
一方、GUI形式であれば、テキストボックスやメニューを使用して入力情報を更新したり、入力に対する出力情報をメインウィンドウ上にリアルタイムで表示することができるメリットがあります。デメリットとしては、GUIアプリケーション作成のための学習コストが高いことと、処理負荷が高いことが挙げられますが、OpenCVやTesseract(OCR)などの既存のライブラリを使用する上ではさほど問題とはなりません。
本記事では、PythonのPyQt5パッケージを使用して指定した入力画像や動画をGUI上のウィジェット内に表示することを導入として、入力画像を動的に差し替える方法や、画像処理結果のリアルタイム表示、OCR結果のリスト表示する方法を紹介します。※動画再生、動画のフレームを任意に切り替える方法やについては、別の記事にまとめる予定です。
以下のような方にご覧いただき、課題解決の一助となりましたら、幸いに思います。
- GUIアプリケーションに興味がある方
- 独自にカスタマイズ可能な画像表示、動画再生用のアプリケーションを開発したい方
- 画像処理用のアプリケーション開発を効率化したい方
動作確認済み環境
CPU: Intel Core i7-9750H
Python: 3.8.5
プラットフォーム: Anaconda 3
パッケージ: pytesseract(0.3.7)※、pyqt(5.9.2)、opencv(4.0.1)
※Tesseract(64bit、v5.0.0)をこちらのwikiをもとに別途インストール済み
アプリケーション概要
具体的な実装内容を紹介する前に、私が実際に作成したアプリケーションの概要を紹介します。
アプリケーションのソースコードはGitHubで公開しています。
実行時に指定するコマンドライン引数と処理概要は以下の通りです。キャンバスサイズはスクリプト実行時にコマンドライン引数で指定するようにしていますが、ソースコードを改修することでGUI上から変更することも可能になります。
(コマンドライン引数)
オプション引数(省略可) | デフォルト値 | 説明 |
-cw, –canvas_width | 420 | ウィジェットに表示する画像サイズ(横幅) |
-ch, –canvas_height | 300 | ウィジェットに表示する画像サイズ(縦幅) |
(機能概要(共通))
- 「input_file_name」ラベル直下のテキストボックスに入力ファイル名を指定し、「Load」ボタンが押すと、キャンバス内に画像・動画が表示される
(表示サイズはコマンドライン引数で指定したものにアスペクト比を保ったまま自動変換されます。動画は1フレーム目が表示されます。) - 「output_file_name」ラベル直下のテキストボックスに出力画像名を指定し、「Save」ボタンを押すと、キャンバス内の画像が保存される
- ドロップダウンメニューで「RGB」を指定するとカラー画像、「MONO」を指定すると2値化画像がキャンバスに表示される
- キャンバス内に表示されている画像からpytesseract(OCR)で文字変換した結果が、キャンバス直下のテーブルに表示される
(機能概要(動画のみ))
- 「Start」ボタンを押すと、動画が再生される
- 「Stop」ボタンを押すと、動画再生を停止する
- スクロールバーを移動すると、キャンバス内に表示される動画フレームが切り替わる
(GUIイメージ)
※PNGフォーマットの画像を表示(左:カラー表示、右:2値化結果)
※mp4フォーマットの動画を表示(左:カラー表示、右:2値化結果)
実装方法の解説
本章では、主にpyqt5_image_viewer_test.py内のウィジェットの作成方法について記載します。メインウィンドウやタブの実装方法(main.py、main_tab.py)については特筆すべき点がないため割愛します。
キャンバスへの画像表示、キャンバスの表示内容を画像出力
①入出力ファイル名を受け付けることができるようにテキストボックスを作成する
(使用するQtWidgets関連クラス)
(該当コード(抜粋・コメント追記))
②画像表示用のキャンバスを作成する
③キャンバスに画像を設定する
(使用するQtWidgets関連クラス)
- ②と同じ
(該当コード(抜粋・コメント追記))
④キャンバスの表示内容を更新するボタン(Load)を作成する
(使用するQtWidgets関連クラス)
- QPushButton: キャンバスへの画像設定、レイアウト更新のトリガとなる「Load」ボタンを作成するために使用
(該当コード(抜粋・コメント追記))
⑤キャンバスの表示内容を画像として出力するボタン(Save)を作成する
(使用するQtWidgets関連クラス)
- ④と同じ
(該当コード(抜粋・コメント追記))
ドロップダウンメニュー(コンボボックス)による画像処理内容の変更
(該当コード(抜粋・コメント追記))
OCRによる文字変換結果をテーブル形式で表示
①OCRにより画像を文字列に変換し、リスト形式で格納する
(使用するQtWidgets関連クラス)
- なし
(該当コード(抜粋・コメント追記))
(使用するQtWidgets関連クラス)
- QTableWidget: 文字列変換結果をテーブル形式で表示するために使用
- QTableWidgetItem: テーブルの1セルに表示するアイテムを設定するために使用
(該当コード(抜粋・コメント追記))
PyQt5で作成したGUIウィンドウで、メインタブのイベントをトリガーとして、複数タブの情報を制御する方法を紹介します。 開発環境は以下の通りです。 OS: Windows 10 64ビット 開発言語: Python […]