以下、図面を参照して本発明の実施形態の一例を詳細に説明する。図1には、本発明に係る画像処理装置として機能することが可能なコンピュータ10が示されている。なお、このコンピュータ10は、複写機、プリンタ、ファクシミリ装置、これらの機能を兼ね備えた複合機、スキャナ、写真プリンタ等のように内部で画像処理を行う必要のある任意の画像取扱機器に組み込まれていてもよいし、パーソナル・コンピュータ(PC)等の独立したコンピュータであってもよく、更にPDA(Personal Digital Assistant)や携帯電話機等の携帯機器に組み込まれたコンピュータであってもよい。
コンピュータ10はCPU12、DRAM又はSRAM等から成るメモリ14、表示部16、操作部18、記憶部20、画像データ供給部22及び画像出力部24を備えており、これらはバス26を介して互いに接続されている。コンピュータ10が上述したような画像取扱機器に組み込まれている場合、表示部16や操作部18としては、画像取扱機器に設けられたLCD等から成る表示パネルやテンキー等を適用することができる。また、コンピュータ10が独立したコンピュータである場合、表示部16や操作部18としては、当該コンピュータに接続されたディスプレイやキーボード、マウス等を適用することができる。また、記憶部20としてはHDD(Hard Disk Drive)が好適であるが、これに代えてフラッシュメモリ等の他の不揮発性記憶手段を用いることも可能である。
また、画像データ供給部22は処理対象の画像データを供給できるものであればよく、例えば紙や写真フィルム等の記録材料に記録されている画像を読み取って画像データを出力する画像読取部、通信回線を介して外部から画像データを受信する受信部、画像データを記憶する画像記憶部(メモリ14又は記憶部20)等を適用することができる。また、画像出力部24は画像処理を経た画像データ又は該画像データが表す画像を出力するものであればよく、例えば画像データが表す画像を紙や感光材料等の記録材料に記録する画像記録部、画像データが表す画像をディスプレイ等に表示する表示部、画像データを記録メディアに書き込む書込装置、画像データを通信回線を介して送信する送信部を適用することができる。また、画像出力部24は画像処理を経た画像データを単に記憶する画像記憶部(メモリ14又は記憶部20)であっても構わない。
図1に示すように、記憶部20には、CPU12によって実行される各種のプログラムとして、メモリ14等のリソースの管理やCPU12によるプログラムの実行の管理、コンピュータ10と外部との通信等を司るオペレーティングシステム30のプログラム、コンピュータ10を本発明に係る画像処理装置として機能させるための画像処理プログラム群34、CPU12が上記画像処理プログラム群を実行することで実現される画像処理装置に対して所望の画像処理を行わせる各種のアプリケーション32のプログラム(図1ではアプリケーションプログラム群32と表記)が各々記憶されている。
画像処理プログラム群34は、前述した各種の画像取扱機器や携帯機器を開発する際の開発負荷を軽減したり、PC等で利用可能な画像処理プログラムを開発する際の開発負荷を軽減することを目的として、各種の画像取扱機器や携帯機器、PC等の各種機器(プラットフォーム)で共通に使用可能に開発されたプログラムであり、本発明に係る画像処理プログラムに対応している。画像処理プログラム群34によって実現される画像処理装置は、アプリケーション32からの構築指示に従い、アプリケーション32が指示した画像処理を行う画像処理部を構築し、アプリケーション32からの実行指示に従い、前記画像処理部によって画像処理を行うが(詳細は後述)、画像処理プログラム群34は、所望の画像処理を行う画像処理部(所望の構成の画像処理部)の構築を指示したり、構築された画像処理部による画像処理の実行を指示するためのインタフェースをアプリケーション32に提供している。このため、内部で画像処理を行う必要のある任意の機器を新規開発する等の場合にも、前記画像処理を行うプログラムの開発に関しては、当該機器で必要とされる画像処理を上記のインタフェースを利用して画像処理プログラム群34に行わせるアプリケーション32を開発するのみで済み、実際に画像処理を行うプログラムを新たに開発する必要が無くなるので、開発負荷を軽減することができる。
また、画像処理プログラム群34によって実現される画像処理装置は、前述のように、アプリケーション32からの構築指示に従い、アプリケーション32が指示した画像処理を行う画像処理部を構築し、構築した画像処理部によって画像処理を行うので、例えば画像処理対象の画像データの色空間や1画素当たりのビット数が不定であったり、実行すべき画像処理の内容や手順・パラメータ等が不定である場合にも、アプリケーション32が画像処理部の再構築を指示することで、画像処理装置(画像処理部)によって実行される画像処理を、処理対象の画像データ等に応じて柔軟に変更することができる。
以下、画像処理プログラム群34について説明する。図1に示すように、画像処理プログラム群34はモジュールライブラリ36と、処理構築部42のプログラムと、処理管理部46のプログラムに大別される。詳細は後述するが、本実施形態に係る処理構築部42は、アプリケーションからの指示により、例として図2に示すように、予め定められた画像処理を行う1つ以上の画像処理モジュール38と、個々の画像処理モジュール38の前段及び後段の少なくとも一方に配置され画像データを記憶するためのバッファを備えたバッファモジュール40と、がパイプライン形態又はDAG(Directed Acyclic Graph:有向非循環グラフ)形態で連結されて成る画像処理部50を構築する。画像処理部50を構成する個々の画像処理モジュールの実体はCPU12によって実行されCPU12で所定の画像処理を行わせるための第1プログラム、又は、CPU12によって実行されCPU12により図1に図示されていない外部の画像処理装置(例えば専用画像処理ボード等)に対する処理の実行を指示するための第2プログラムであり、上述したモジュールライブラリ36には、予め定められた互いに異なる画像処理(例えば入力処理やフィルタ処理、色変換処理、拡大・縮小処理、スキュー角検知処理、画像回転処理、画像合成処理、出力処理等)を行う複数種の画像処理モジュール38のプログラムが各々登録されている。以下では、説明を簡単にするために、画像処理部50を構成する個々の画像処理モジュールの実体が上記の第1プログラムであるものとして説明する。
個々の画像処理モジュール38は、例として図3(A)にも示すように、画像データに対する画像処理を所定の単位処理データ量ずつ行う画像処理エンジン38Aと、画像処理モジュール38の前段及び後段のモジュールとの画像データの入出力及び画像処理エンジン38Aの制御を行う制御部38Bから構成されている。個々の画像処理モジュール38における単位処理データ量は、画像の1ライン分、画像の複数ライン分、画像の1画素分、画像1面分等を含む任意のバイト数の中から、画像処理エンジン38Aが行う画像処理の種類等に応じて予め選択・設定されており、例えば色変換処理やフィルタ処理を行う画像処理モジュール38では単位処理データ量が1画素分とされ、拡大・縮小処理を行う画像処理モジュール38では単位処理データ量が画像の1ライン分又は画像の複数ライン分とされ、画像回転処理を行う画像処理モジュール38では単位処理データ量が画像1面分とされ、画像圧縮伸長処理を行う画像処理モジュール38では単位処理データ量が実行環境に依存するNバイトとされている。
また、モジュールライブラリ36には、画像処理エンジン38Aが実行する画像処理の種類が同一でかつ実行する画像処理の内容が異なる画像処理モジュール38も登録されている(図1では、この種の画像処理モジュールを「モジュール1」「モジュール2」と表記して示している)。例えば拡大・縮小処理を行う画像処理モジュール38については、入力された画像データを1画素おきに間引くことで50%に縮小する縮小処理を行う画像処理モジュール38、入力された画像データに対して指定された拡大・縮小率で拡大・縮小処理を行う画像処理モジュール38等の複数の画像処理モジュール38が各々用意されている。また、例えば色変換処理を行う画像処理モジュール38については、RGB色空間をCMY色空間へ変換する画像処理モジュール38やその逆へ変換する画像処理モジュール38、L*a*b*色空間等の他の色空間変換を行う画像処理モジュール38が各々用意されている。
また、画像処理モジュール38の制御部38Bは、画像処理エンジン38Aが単位処理データ量ずつ処理するために必要な画像データを入力するために、自モジュールの前段のモジュール(例えばバッファモジュール40)から画像データを単位読出データ量ずつ取得し、画像処理エンジン38Aから出力される画像データを単位書込データ量ずつ後段のモジュール(例えばバッファモジュール40)へ出力する(画像処理エンジン38Aで圧縮等のデータ量の増減を伴う画像処理が行われなければ単位書込データ量=単位処理データ量となる)か、画像処理エンジン38Aによる画像処理の結果を自モジュールの外部へ出力する(例えば画像処理エンジン38Aがスキュー角検知処理等の画像解析処理を行う場合、画像データに代えてスキュー角検知結果等の画像解析処理結果が出力されることがある)処理を行うが、モジュールライブラリ36には、画像処理エンジン38Aが実行する画像処理の種類及び内容が同一で、上記の単位処理データ量や単位読出データ量、単位書込データ量が異なる画像処理モジュール38も登録されている。例えば画像回転処理を行う画像処理モジュール38における単位処理データ量についても、前述した画像1面分に限られるものではなく、同じ画像回転処理を行いかつ単位処理データ量が互いに異なる(例えば画像の1ライン分や複数ライン分等の)複数の画像処理モジュール38がモジュールライブラリ36に含まれていても良い。
また、モジュールライブラリ36に登録されている個々の画像処理モジュール38のプログラムは、画像処理エンジン38Aに相当するプログラムと制御部38Bに相当するプログラムから構成されているが、制御部38Bに相当するプログラムは部品化されており、個々の画像処理モジュール38のうち単位読出データ量及び単位書込データ量が同一の画像処理モジュール38は、画像処理エンジン38Aで実行される画像処理の種類や内容に拘わらず、制御部38Bに相当するプログラムが共通化されている(制御部38Bに相当するプログラムとして同一のプログラムが用いられている)。これにより、画像処理モジュール38のプログラムの開発にあたっての開発負荷が軽減される。
なお、画像処理モジュール38の中には、入力される画像の属性が未知の状態では単位読出データ量及び単位書込データ量が確定しておらず、入力画像データの属性を取得し、取得した属性を所定の演算式に代入して演算することで単位読出データ量や単位書込データ量が確定するモジュールが存在しているが、この種の画像処理モジュール38については、単位読出データ量と単位書込データ量が互いに同一の演算式を用いて導出される画像処理モジュール38について、制御部38Bに相当するプログラムを共通化するようにすればよい。また、本実施形態に係る画像処理プログラム群34は、前述のように各種機器に実装可能であるが、画像処理プログラム群34のうちモジュールライブラリ36に登録する画像処理モジュール38の数や種類等については、画像処理プログラム群34を実装する各種機器で必要とされる画像処理に応じて、適宜追加・削除・入替等が可能であることは言うまでもない。
また、画像処理部50を構成する個々のバッファモジュール40は、例として図3(B)にも示すように、バッファ40Aと、バッファモジュール40の前段及び後段のモジュールとの画像データの入出力及びバッファ40Aの管理を行うバッファ制御部40Bから構成されている。なお、バッファ40Aはコンピュータ10に設けられたメモリ14からオペレーティングシステム30及びリソース管理部46Cを通じて確保されたメモリ領域で構成される。個々のバッファモジュール40のバッファ制御部40Bもその実体はCPU12によって実行されるプログラムであり、モジュールライブラリ36にはバッファ制御部40Bのプログラムも登録されている(図1ではバッファ制御部40Bのプログラムを「バッファモジュール」と表記して示している)。
また、アプリケーション32からの指示に従って画像処理部50を構築する処理構築部42は、図1に示すように複数種のモジュール生成部44から構成されている。複数種のモジュール生成部44は互いに異なる画像処理に対応しており、アプリケーション32によって起動されることで、対応する画像処理を実現するための画像処理モジュール38及びバッファモジュール40から成るモジュール群を生成する処理を行う。なお、図1ではモジュール生成部44の一例として、モジュールライブラリ36に登録されている個々の画像処理モジュール38が実行する画像処理の種類に対応するモジュール生成部44を示しているが、個々のモジュール生成部44に対応する画像処理は、複数種の画像処理モジュール38によって実現される画像処理(例えばスキュー角検知処理と画像回転処理から成るスキュー補正処理)であってもよい。必要とされる画像処理が複数種の画像処理を組み合わせた処理である場合、アプリケーション32は複数種の画像処理の何れかに対応するモジュール生成部44を順次起動する。これにより、アプリケーション32によって順次起動されたモジュール生成部44により、必要とされる画像処理を行う画像処理部50が構築されることになる。
また図1に示すように、処理管理部46は、画像処理部50における画像処理の実行を制御する処理フロー管理部46A、画像処理部50の各モジュールによるメモリ14や各種のファイル等のコンピュータ10のリソースの使用を管理するリソース管理部46C、及び、画像処理部50で発生したエラーを管理するエラー管理部46Bを含んで構成されている。エラー管理部46Bは、画像処理部50が画像処理を実行している途中でエラーが発生した場合に、発生したエラーの種別・発生箇所等のエラー情報を取得し、画像処理プログラム群34がインストールされたコンピュータ10が組み込まれている機器の種別や構成等を表す装置環境情報を記憶部20等から取得し、取得した装置環境情報が表す装置環境に応じたエラー通知方法を判断し、判断したエラー通知方法でエラーの発生を通知する処理を行う。
次に本実施形態の作用を説明する。画像処理プログラム群34が実装されている機器において、何らかの画像処理を行う必要のある状況になると、この状況が特定のアプリケーション32によって検知される。なお、画像処理を行う必要のある状況としては、例えば画像データ供給部22としての画像読取部によって画像を読み取り、画像出力部24としての画像記録部により記録材料に画像として記録するか、画像出力部24としての表示部に画像として表示させるか、画像出力部24としての書込装置により画像データを記録メディアに書き込むか、画像出力部24としての送信部により画像データを送信するか、画像出力部24としての画像記憶部に記憶させるジョブの実行がユーザによって指示された場合、或いは、画像データ供給部22としての受信部によって受信されるか、画像データ供給部22としての画像記憶部に記憶されている画像データに対して、上記の記録材料への記録、表示部への表示、記録メディアへの書き込み、送信、画像記憶部への記憶の何れかを行うジョブの実行がユーザによって指示された場合が挙げられる。また、画像処理を行う必要のある状況は上記に限られるものではなく、例えばユーザからの指示に応じてアプリケーション32が実行可能な処理の名称等を表示部16に一覧表示している状態で、実行対象の処理がユーザによって選択された等の場合であってもよい。
上記のように、何らかの画像処理を行う必要のある状況になったことを検知すると、アプリケーション32は、画像処理対象の画像データを供給する画像データ供給部22の種別を認識し、認識した種別がバッファ領域(メモリ14の一部領域)であった場合には、画像データ供給部22として指定されたバッファ領域を既に確保されたバッファ40Aとしてバッファ制御部40Bに認識させるパラメータを設定し、バッファ制御部40Bのプログラムを実行するスレッド(プロセス又はオブジェクトでもよい:以下同様)を生成する(バッファ制御部40Bを生成する)ことで、指定されたバッファ領域を含むバッファモジュール40(画像データ供給部22として機能するバッファモジュール40)を生成する。
続いてアプリケーション32は、上記と同様に、画像処理を行った画像データの出力先としての画像出力部24の種別を認識し、認識した種別がバッファ領域(メモリ14の一部領域)であった場合は、画像出力部24として指定されたバッファ領域を含むバッファモジュール40を上記と同様にして生成する。ここで生成されたバッファモジュール40は画像出力部24として機能する。また、アプリケーション32は実行すべき画像処理の内容を認識し、実行すべき画像処理を、個々のモジュール生成部44に対応するレベルの画像処理の組み合わせに分解し、実行すべき画像処理を実現するために必要な画像処理の種類及び個々の画像処理の実行順序を判定する。なお、この判定は、例えば上記の画像処理の種類及び個々の画像処理の実行順序を、ユーザが実行を指示可能なジョブの種類と対応付けて予め情報として登録しておき、アプリケーション32は、実行が指示されたジョブの種類に対応する情報を読み出すことによって実現することができる。
そしてアプリケーション32は、上記で判定した画像処理の種類及び実行順序に基づいて、特定の画像処理に対応するモジュール生成部44を起動(モジュール生成部44のプログラムを実行するスレッドを生成)した後に、起動したモジュール生成部44に対し、当該モジュール生成部44によるモジュール群の生成に必要な情報として、前記モジュール群に画像データを入力する入力モジュールを識別するための入力モジュール識別情報、前記モジュール群が画像データを出力する出力モジュールを識別するための出力モジュール識別情報、前記モジュール群に入力される入力画像データの属性を表す入力画像属性情報、実行すべき画像処理のパラメータを通知して対応するモジュール群の生成を指示する。また、必要とされる画像処理が複数種の画像処理を組み合わせた処理である場合、アプリケーション32は、指示したモジュール生成部44からモジュール群の生成完了が通知されると、個々の画像処理に対応する他のモジュール生成部44を起動してモジュール群の生成に必要な情報を通知する処理を個々の画像処理の実行順序の昇順に繰り返す。
なお、上記の入力モジュールは、実行順序が1番目のモジュール群については画像データ供給部22が入力モジュールとなり、実行順序が2番目以降のモジュール群については前段のモジュール群の最終モジュール(通常はバッファモジュール40)が入力モジュールとなる。また、上記の出力モジュールについては、実行順序が最後のモジュール群では画像出力部24が出力モジュールとなるので、画像出力部24が出力モジュールとして指定されるが、その他のモジュール群では出力モジュールは未確定のためにアプリケーション32による指定は行われず、必要な場合はモジュール生成部44によって生成・設定される。また、入力画像属性や画像処理のパラメータについては、例えばユーザが実行を指示可能なジョブの種類と対応付けて予め情報として登録しておき、実行が指示されたジョブの種類に対応する情報を読み出すことでアプリケーション32が認識するようにしてもよいし、ユーザに指定させるようにしてもよい。
一方、モジュール生成部44は、アプリケーション32によって起動されるとモジュール生成処理を行う。モジュール生成処理では、まず生成対象の画像処理モジュール38に入力される入力画像データの属性を表す入力画像属性情報を取得する。なお、入力画像データの属性を取得する処理は、生成対象の画像処理モジュール38の前段にバッファモジュール40が存在している場合、当該バッファモジュール40に画像データの書き込みを行う更に前段の画像処理モジュール38から出力画像データの属性を取得することによって実現できる。
そして、取得した情報が表す入力画像データの属性に基づいて、生成対象の画像処理モジュール38の生成が必要か否か判定する。例えばモジュール生成部44が色変換処理を行うモジュール群を生成するモジュール生成部であり、画像処理のパラメータにより出力画像データの色空間としてCMY色空間がアプリケーション32から指定された場合、取得した入力画像属性情報に基づいて入力画像データがRGB色空間のデータであることが判明したときには、色空間処理を行う画像処理モジュール38としてRGB→CMYの色空間変換を行う画像処理モジュール38を生成する必要があるが、入力画像データがCMY色空間のデータであったときには、入力画像データの属性と出力画像データの属性が色空間に関して一致しているので、色空間変換処理を行う画像処理モジュール38は生成不要と判断する。
生成対象の画像処理モジュール38の生成が必要と判断した場合には、生成対象の画像処理モジュール38の後段にバッファモジュール40が必要が否かを判定する。この判定は、画像処理モジュールの後段が出力モジュール(画像出力部24)である場合(例えば図2(A)〜(C)に示す画像処理部50における最後段の画像処理モジュール38を参照)や、例として図2(B)に示す画像処理部50においてスキュー角検知処理を行う画像処理モジュール38のように、画像処理モジュールが、画像データに対して解析等の画像処理を行いその結果を他の画像処理モジュール38へ出力するモジュールである場合は否定されるが、上記以外の場合は判定が肯定されてバッファ制御部40Bを起動することで、画像処理モジュール38の後段に連結するバッファモジュール40を生成する。
続いて、前段のモジュール(例えばバッファモジュール40)の情報、後段のバッファモジュール40の情報(後段にバッファモジュール40を生成した画像処理モジュール38のみ)、画像処理モジュール38に入力される入力画像データの属性、処理パラメータを与えて、モジュールライブラリ36に登録されており、画像処理モジュール38として利用可能な複数の候補モジュールの中から、先に取得した入力画像データの属性、及び、画像処理モジュール38で実行すべき処理パラメータに合致する画像処理モジュール38を選択・生成する。
例えばモジュール生成部44が色変換処理を行うモジュール群を生成するモジュール生成部であり、処理パラメータにより出力画像データの色空間としてCMY色空間が指定され、更に入力画像データがRGB色空間のデータであった場合には、モジュールライブラリ36に登録されている各種の色空間処理を行う複数種の画像処理モジュール38の中から、RGB→CMYの色空間変換を行う画像処理モジュール38が選択・生成される。また、画像処理モジュールが拡大・縮小処理を行う画像処理モジュール38であり、指定された拡大縮小率が50%以外であれば、入力された画像データに対して指定された拡大・縮小率で拡大・縮小処理を行う画像処理モジュール38が選択・生成され、指定された拡大縮小率が50%であれば、拡大縮小率50%に特化した拡大縮小処理、すなわち入力された画像データを1画素おきに間引くことで50%に縮小する縮小処理を行う画像処理モジュール38が選択・生成される。
なお、画像処理モジュール38の選択は上記に限られるものではなく、例えば画像処理エンジン38Aによる画像処理における単位処理データ量が異なる画像処理モジュール38をモジュールライブラリ36に複数登録しておき、画像処理部50へ割当可能なメモリ領域のサイズ等の動作環境に応じて、適切な単位処理データ量の画像処理モジュール38を選択する(例えば上記サイズが小さくなるに従って単位処理データ量の小さい画像処理モジュール38を選択する等)ようにしてもよいし、アプリケーション32或いはユーザに選択させるようにしてもよい。
またモジュール生成部44が、複数種の画像処理モジュール38によって実現される画像処理(例えばスキュー角検知処理を行う画像処理モジュール38と画像回転処理を行う画像処理モジュール38によって実現されるスキュー補正処理)を行うモジュール群を生成する場合には、上記処理が繰り返されて2個以上の画像処理モジュール38を含むモジュール群が生成される。アプリケーション32によって順次起動された個々のモジュール生成部44により、以上のモジュール生成処理が順次行われることで、例として図2(A)〜(C)に示すように、必要とされる画像処理を行う画像処理部50が構築される。
更に、モジュール生成部44が生成する画像処理モジュール38が、別の画像処理モジュール38による画像処理の結果(例えばヒストグラム等の画像解析処理結果)を用いて画像処理を行うモジュールであり、前記別の画像処理モジュール38が未生成の場合には、モジュール生成部44によって前記別の画像処理モジュール38(或いは前記別の画像処理モジュール38を含むモジュール群)の生成も行われる。一例として図5(A)に示す画像処理部50では、「画像処理B」と表記した画像処理モジュール38が、「画像処理N1」と表記した画像処理モジュール38及び「画像処理N2」と表記した画像処理モジュール38による画像処理の結果を用いて画像処理を行う構成であり、このような画像処理部50を構築する場合、「画像処理B」の画像処理モジュール38を生成するモジュール生成部44により、「画像処理L1」の画像処理モジュール38、「BuffL1」のバッファモジュール40、「画像処理M1」の画像処理モジュール38、「BuffM1」のバッファモジュール40、及び、「画像処理N1」の画像処理モジュール38から成るモジュール群と、「画像処理L2」の画像処理モジュール38、「BuffL2」のバッファモジュール40、「画像処理M2」の画像処理モジュール38、「BuffM2」のバッファモジュール40、及び、「画像処理N2」の画像処理モジュール38から成るモジュール群が各々生成されることになる。なお、上記処理は本発明に係る構築手段に対応している。
なお、画像処理部50として動作するプログラムの実行については、画像処理部50を構成する個々のモジュールを単位とし、個々のモジュールのプログラムを実行するスレッドを生成し、CPU12によって実行させるようにしてもよいが、次に説明する処理管理部生成処理で生成される個々の処理管理部46によって管理されるモジュール群(独立して並列に動作可能なモジュール群)を単位としてスレッドを生成し、CPU12によって実行させるようにすることが好ましい。
一方、処理構築部42は、アプリケーション32からの指示に従い、画像処理部50を構成する個々のモジュールを順次生成する上述した処理と並行して、図4に示す処理管理部生成処理を行う。なお、以下で説明する処理管理部生成処理は本発明に係る管理部生成手段による処理に対応しており、処理構築部42は本発明に係る管理部生成手段(より詳しくは請求項1〜請求項3に記載の管理部生成手段)としても機能する。
この処理管理部生成処理では、まずステップ100において、処理管理部46のプログラムを実行するスレッドを生成することで、コンピュータ10上で動作する処理管理部46の処理フロー管理部46A、リソース管理部46C及びエラー管理部46Bを各々生成する。また、処理フロー管理部46Aは管理対象のモジュールの識別情報を登録するための管理テーブルを備えており、次のステップ102では、ステップ100で生成した処理フロー管理部46Aの管理テーブルをクリア(初期化)する。次のステップ104では新たな画像処理モジュール38が生成されたか否か判定する。この判定が否定された場合はステップ106へ移行し、画像処理部50の構築が完了したか否か判定する。この判定も否定された場合はステップ104に戻り、何れかの判定が肯定される迄ステップ104,106を繰り返す。
また、アプリケーション32からの指示に従って新たな画像処理モジュール38が生成されると、ステップ104の判定が肯定されてステップ108へ移行し、今回生成された画像処理モジュール38が、画像データ供給部22から画像データを読み込んで後段へ出力するデータ読込モジュール、画像データを生成して後段へ出力するデータ生成モジュール、他の画像処理モジュール38と共に同一のバッファモジュール40(分岐モジュール)の後段(次段)に接続された画像処理モジュール38(単一のバッファモジュール40の後段に複数のモジュール群が連結され、同一の画像データが複数のモジュール群へ各々出力(分岐)される構成において、個々のモジュール群の先頭に相当する画像処理モジュール38:請求項2に記載の特定モジュールの一例)の何れかに該当するか否か判定する。
詳細は後述するが、本実施形態に係る処理管理部生成処理では、画像処理部50を互いに独立して並列に動作可能な複数のモジュール群に分割したときの個々のモジュール群を単位として処理フロー管理部46Aを設けており、上述したステップ108の判定では、今回生成された画像処理モジュール38が、画像処理部50を互いに独立して並列に動作可能な複数のモジュール群に分割した場合の何れかのモジュール群(対応する処理フロー管理部46Aを設けるモジュール群)の先頭になり得る画像処理モジュール38か否かを判断している。
すなわち、前述したデータ読込モジュールを先頭とするモジュール群は、当該モジュール群への画像データの入力が、先頭のデータ読込モジュールによる画像データ供給部22からの画像データの読み込み・出力によって成され、他のモジュール群における処理の進行に依存していないので、他のモジュール群と独立して並列に動作可能である可能性が高い。例えば図5(A)に示す「画像処理A」「画像処理L1」「画像処理L2」の各画像処理モジュール38は何れもデータ読込モジュールであり、これらのデータ読込モジュールを先頭とする個々のモジュール群(画像処理A、BuffA、画像処理B、BuffB、画像処理C、BuffC、画像処理Dから成る第1モジュール群、画像処理L1、BuffL1、画像処理M1、BuffM1、画像処理N1から成る第2モジュール群、及び、画像処理L2、BuffL2、画像処理M2、BuffM2、画像処理N2から成る第3モジュール群)は互いに独立して並列に動作可能である。
また、前述したデータ生成モジュールを先頭とするモジュール群についても、当該モジュール群への画像データの入力が、先頭のデータ生成モジュールによる画像データの生成・出力によって成され、他のモジュール群における処理の進行に依存していないので、他のモジュール群と独立して並列に動作可能である可能性が高い。また、分岐モジュールの後段(次段)のモジュールを先頭とするモジュール群についても、他のモジュール群と独立して並列に動作可能である可能性が高い。例えば図7(A)に示す画像処理部50における「画像処理B」「画像処理L1」「画像処理L2」の各画像処理モジュール38は、何れも分岐モジュールとしてのバッファモジュールBuffAの後段(次段)のモジュールであり、これらの画像処理モジュールを先頭とする個々のモジュール群(画像処理B、BuffB、画像処理C、BuffC、画像処理Dから成る第1モジュール群、画像処理L1、BuffL1、画像処理M1、BuffM1、画像処理N1から成る第2モジュール群、及び、画像処理L2、BuffL2、画像処理M2、BuffM2、画像処理N2から成る第3モジュール群)は互いに独立して並列に動作可能である。
このため、ステップ110の判定が肯定された場合、今回生成された画像処理モジュール38は、他のモジュール群と独立して並列に動作可能なモジュール群の先頭に位置している可能性が高いと判断できるので、ステップ112へ移行し、処理管理部生成処理で生成した処理フロー管理部46Aの中に、管理テーブルに管理対象のモジュールの識別情報が未登録の処理フロー管理部46A(今回生成された画像処理モジュール38を先頭とするモジュール群に割当可能な処理フロー管理部46A)が存在しているか否か判定する。
今回生成された画像処理モジュール38が画像処理部50の先頭に位置している場合、先のステップ100で生成した処理フロー管理部46Aは、管理対象のモジュールを未割当ての状態であるので、当初はステップ110の判定が肯定されてステップ116へ移行し、今回生成された画像処理モジュール38の識別情報を管理対象として管理テーブルに登録する処理フロー管理部46Aを既存の処理フロー管理部46Aの中から選択する。なお、先のステップ110の判定が肯定された場合、上記の処理フロー管理部46Aとしては、管理テーブルに管理対象のモジュールの識別情報が未登録の処理フロー管理部46A(ステップ100で生成された処理フロー管理部46A)が選択される。次のステップ118では、今回生成された画像処理モジュール38の後段のモジュールが別系統のモジュール群へ画像データを出力しているか否か判定する。
ステップ118の判定が否定された場合はステップ124へ移行し、今回生成された画像処理モジュール38の識別情報(ID)を、当該画像処理モジュール38の後段に連結されたバッファモジュール40の識別情報(ID)と対応付け、対応する処理フロー管理部46A(ここではステップ116で選択した処理フロー管理部46A)の管理テーブルに登録する。なお、上記の識別情報(ID)は個々のモジュールを一意に判別できる情報であればよく、例えば個々のモジュールの生成順に付与した番号や、バッファモジュール40や画像処理モジュール38のオブジェクトのメモリ上でのアドレス等でも良い。ステップ124の処理を行うとステップ104に戻り、ステップ104,106を繰り返す。
また、単一の画像処理部50において、データ読込モジュール、データ生成モジュール、分岐モジュールの後段(次段)のモジュールの何れかに該当する画像処理モジュール38が複数生成された場合、2番目以降に生成された上記の画像処理モジュール38に対しては、ステップ108の判定が肯定されると共にステップ110の判定が否定されてステップ112へ移行し、処理管理部46のプログラムを実行するスレッドを追加生成することで、今回生成された画像処理モジュール38(を先頭とするモジュール群)に対応する処理管理部46(少なくとも処理フロー管理部46Aを備えた処理管理部46)を追加生成する。また、次のステップ114では、ステップ112で生成した処理フロー管理部46Aの管理テーブルをクリア(初期化)する。そしてステップ124へ移行し、今回生成された画像処理モジュール38の識別情報(ID)を、当該画像処理モジュール38の後段に連結されたバッファモジュール40の識別情報(ID)と対応付け、ステップ112で生成した対応する処理フロー管理部46Aの管理テーブルに登録する。
上記のように、ステップ108の判定が肯定されると共にステップ110の判定が否定される毎に、処理管理部46(処理フロー管理部46A)が追加生成されることで、例として図5(B),図7(B)に示すように、データ読込モジュール、データ生成モジュール、分岐モジュールの後段(次段)のモジュールの何れかを先頭とするモジュール群を単位として、処理管理部46(処理フロー管理部46A)が各々生成される (図5(B)は画像処理A、画像処理L1、画像処理L2の3個のデータ読込モジュールを各々先頭とする3個のモジュール群に対応して3個の処理管理部46(処理フロー管理部46A)が生成され、図7(B)は画像処理Aのデータ読込モジュール、及び、画像処理B、画像処理L1、画像処理L2の3個のデータ読込モジュールを各々先頭とする合計4個のモジュール群に対応して4個の処理管理部46(処理フロー管理部46A)が生成された例を示す)。
また、データ読込モジュール、データ生成モジュール、分岐モジュールの後段(次段)のモジュールの何れにも該当しない画像処理モジュール38が生成された場合、ステップ108の判定が否定されてステップ116へ移行するが、この場合は、今回生成された画像処理モジュール38の識別情報を管理対象として管理テーブルに登録する処理フロー管理部46Aとして、今回生成された画像処理モジュール38の前段に存在するモジュールと同一の処理フロー管理部46Aが選択され、ステップ124において、今回生成された画像処理モジュール38及びその後段に連結されたバッファモジュール40の識別情報(ID)は、ステップ116で選択した処理フロー管理部46Aの管理テーブルに登録されることになる。
これにより、図5(B),図7(B)にも示すように、個々の処理管理部46の処理フロー管理部46Aの管理テーブルには、対応するモジュール群(管理対象のモジュール群)の個々のモジュールの識別情報のみが登録され、個々の処理管理部46の処理フロー管理部46Aにより、画像処理部50における画像処理の実行を管理する処理が、データ読込モジュール、データ生成モジュール、分岐モジュールの後段(次段)のモジュールの何れかを先頭とする個々のモジュール群を単位として行われることになる。
また、前述のステップ112で追加生成する処理管理部46は、少なくとも処理フロー管理部46Aを備えた処理管理部46であればよいが、図5(B),図7(B)では、処理フロー管理部46Aに加えてエラー管理部46Bも備えた処理管理部46を追加生成した例を示している。この場合、画像処理部50で発生したエラーを管理するエラー管理処理についても、データ読込モジュール、データ生成モジュール、分岐モジュールの後段(次段)のモジュールの何れかを先頭とする個々のモジュール群を単位として行われる。また、ステップ112において、処理フロー管理部46A及びリソース管理部46Cを備えた処理管理部46を追加生成するようにしてもよいし、処理フロー管理部46A、エラー管理部46B及びリソース管理部46Cを各々備えた処理管理部46を追加生成するようにしてもよい。
一方、モジュールライブラリ36には画像合成処理を行う画像処理モジュール38のプログラムが登録されているが、例えば図2(C)に示すように、画像合成処理等のように複数の画像データを用いる画像処理を行う画像処理モジュール38は、互いに異なるモジュールから出力された複数の画像データを用いて画像処理を行うので、複数の画像データを用いる画像処理を行う画像処理モジュール38を先頭とするモジュール群における処理の進行は、前段の複数のモジュール群(複数の画像データを用いる画像処理を行う画像処理モジュール38へ画像データを出力する複数のモジュールを各々末尾とする複数のモジュール群)における処理の進行に依存しており、複数の画像データを用いる画像処理を行う画像処理モジュール38を先頭とするモジュール群については、前段の複数のモジュール群と画像処理の実行を一体に管理することが処理効率上望ましい。
前述のステップ118では、今回生成された画像処理モジュール38の後段のモジュールが、複数の画像データを用いる画像処理を行う画像処理モジュール38を先頭とするモジュール群へ画像データを出力するように連結されているか否か判定しており、この判定が肯定された場合はステップ120、122において、今回生成された画像処理モジュール38を含むモジュール群に対応する処理フロー管理部46A(処理管理部46)を、今回生成された画像処理モジュール38の後段のモジュールが連結されているモジュール群に対応する別の処理フロー管理部46A(処理管理部46)と統合する処理を行う。
すなわち、ステップ120では、先のステップ116で選択した処理フロー管理部46Aの管理テーブルに登録されている各モジュールの識別情報を、今回生成された画像処理モジュール38の後段のモジュールが連結されているモジュール群に対応する別の処理フロー管理部46Aの管理テーブルに複写する。そしてステップ122では、先のステップ116で選択した処理フロー管理部(処理管理部46)のプログラムを実行するスレッドを消去(削除)した後にステップ124へ移行する。
これにより、先のステップ116で選択した処理フロー管理部46A(処理管理部46)が、今回生成された画像処理モジュール38の後段のモジュールが連結されているモジュール群に対応する別の処理フロー管理部46A(処理管理部46)と統合され、ステップ124において、今回生成された画像処理モジュール38及びその後段に連結されたバッファモジュール40の識別情報(ID)は、統合後の処理フロー管理部46Aの管理テーブルに登録される。従って、今回生成された画像処理モジュール38を含むモジュール群は、同一の処理フロー管理部46Aにより、今回生成された画像処理モジュール38の後段のモジュールが連結されている別のモジュール群と画像処理の実行が一体に管理されることになる。
次に、上記の処理で構築された画像処理部50で画像処理が行われる際の個々の画像処理モジュール38及びバッファモジュール40の動作を順に説明する。
画像処理の実行時には、対応する処理フロー管理部46Aから個々の画像処理モジュール38に処理要求が入力される(図3(A)の(1)も参照)。画像処理モジュール38は、処理要求が入力されると、予め設定された識別情報で規定されている自モジュールの前段のモジュール(通常はバッファモジュール40)に対して画像データを要求する(図3(A)の(2)も参照)。読出可能な有効データがバッファモジュール40のバッファ40Aに単位読出データ量以上記憶されていれば、バッファモジュール40から読出領域の先頭アドレスが通知されて画像データの読出が要請される。これにより、画像処理モジュール38は先頭アドレスが通知された前段のモジュールの読出領域から単位読出データ量の画像データを読み出す(図3(A)の(3)も参照)。
次に、画像処理モジュール38は自モジュールの後段のモジュールに対してデータ出力用の領域を要求し、データ出力領域(後段のモジュールがバッファモジュール40であれば当該バッファモジュール40から先頭アドレスが通知された書込領域)が取得できたら(図3(A)の(4)も参照)、先に前段のモジュールから取得した画像データ、後段のモジュールから取得したデータ出力領域(の先頭アドレス)を画像処理エンジン38Aに入力し、入力したデータに対して所定の画像処理を行わせる(図3(A)の(5)も参照)と共に、処理後のデータをデータ出力領域に書き込ませる(図3(A)の(6)も参照)。そして、画像処理エンジン38Aへの単位読出データ量のデータの入力が完了し、画像処理エンジン38Aから出力されたデータがデータ出力領域に全て書き込まれると、出力完了を後段のモジュールに通知すると共に、先に入力された処理要求に対応する処理を完了したことを処理要求元(対応する処理フロー管理部46A)へ通知する(図3(A)の(7)も参照)。個々の画像処理モジュール38で上記処理が繰り返されることで、画像処理部50における画像処理が実現される。
なお、画像処理モジュール38によっては、他の画像処理モジュール38から処理要求が入力されることがある。例えば図5に示す画像処理部50では、前述のように、画像処理L1、BuffL1、画像処理M1、BuffM1、画像処理N1から成る第2モジュール群、及び、画像処理L2、BuffL2、画像処理M2、BuffM2、画像処理N2から成る第3モジュール群が、画像処理Bの画像処理モジュール38からの指示によって生成されるが、各モジュール群の最後段の画像処理モジュール38(画像処理N1及び画像処理N2の画像処理モジュール38)は、画像処理Bの画像処理モジュール38から処理要求が入力されることで上記の処理シーケンスが実現される。
また、バッファモジュール40のバッファ制御部40Bは、予め設定された識別情報で規定されている自モジュールの後段のモジュール(通常は画像処理モジュール38)から画像データが要求されると(図3(B)の(1)も参照)、要求された画像データがバッファ40Aに記憶されているか否かチェックする(図3(B)の(2)も参照)が、読出可能な有効データがバッファ40Aに単位読出データ量以上記憶されていない場合は、処理フロー管理部46Aに対して画像データを要求する(図3(B)の(3)も参照)。ここで、処理フロー管理部46Aは、画像データ要求元のバッファモジュール40の識別情報(ID)をキーにして管理テーブルを検索し、画像データ要求元のバッファモジュール40の識別情報(ID)と対応付けて管理テーブルに識別情報(ID)が登録されている画像処理モジュール38を、画像データ要求元のバッファモジュール40の前段に位置している画像処理モジュール38と認識し、認識した画像処理モジュール38に処理要求を入力する(図3(B)の(4)も参照)。
そして、図3(A)に示したシーケンスを経て、前段の画像処理モジュール38によってバッファ40Aに画像データが書き込まれ(図3(B)の(5),(6)も参照)、バッファ40Aから読出可能な有効データが単位読出データ量以上になると、バッファモジュール40から後段の画像処理モジュール38に対して読出領域の先頭アドレスが通知され、後段の画像処理モジュール38によってバッファモジュール40のバッファ40Aから画像データが読み出されることになる(図3(B)の(7)も参照)。
一方、先の処理管理部生成処理によって生成された個々の処理管理部46の処理フロー管理部46Aは、画像処理部50の構築完了を検知したアプリケーション32から画像処理の実行が指示されると、画像処理部50のうち管理対象のモジュール群の最後段に位置している画像処理モジュール38に処理要求を入力し(管理対象のモジュール群が、図5の第2モジュール群や第3モジュール群等のように他の画像処理モジュール38からの指示によって生成された場合を除く)、管理対象のモジュール群の最後段に位置している画像処理モジュール38から処理完了通知が入力される毎に、当該最後段に位置している画像処理モジュール38に処理要求を再度入力することを、前記最後段に位置している画像処理モジュール38から全体処理の終了(処理対象の画像データ(例えば1フレーム分の画像データ)に対する画像処理の終了)が通知される迄繰り返し、前記最後段に位置している画像処理モジュール38から全体処理の終了が通知されると、画像処理の実行を指示したアプリケーション32に対して管理対象のモジュール群における画像処理の実行終了を通知する。
また、個々の処理管理部46の処理フロー管理部46Aは、管理対象のモジュール群で画像処理が行われている間、管理対象のモジュール群の任意のバッファモジュール40からデータ要求が入力される毎に、前述のように管理テーブルの検索を行うことで、データ要求入力元のバッファモジュール40の前段の画像処理モジュール38を認識し、認識した画像処理モジュール38に処理要求を入力する。ここで、画像処理部50を構成するモジュールの数は画像処理部50で行う画像処理の内容や画像処理部50が画像処理を行う画像データの内容等によって変化し、画像処理の内容や画像データの内容等によっては、モジュールが数千〜数万個もの膨大な数のモジュールによって画像処理部50が構成されることも生じ得る。そして、画像処理部50を構成するモジュールが膨大な数に上ると、処理フロー管理部46Aの管理テーブルにも膨大な数のモジュールの識別情報(ID)が登録されることになるので、データ要求が入力される毎に行われる管理テーブルの検索に要する時間が長時間化し、処理効率が大幅に低下する。
これに対して本実施形態では、画像処理部50を互いに独立して並列に動作可能な複数のモジュール群に分割したときの個々のモジュール群を単位として処理フロー管理部46Aを設けているので、図5(B)に示す個々の処理フロー管理部46Aの管理テーブルのサイズを、図5(A)に示す単一の処理フロー管理部46Aの管理テーブルのサイズと比較しても明らかなように、個々の処理フロー管理部46Aの管理テーブルのサイズを小さくすることができ、管理テーブルの検索に要する時間を短縮することができる。
また、画像処理の実行中に画像処理部50を構成する何れかのモジュールでエラーが発生した場合、エラーが発生したモジュールを含むモジュール群を管理対象とする処理管理部46のエラー管理部46Bへエラーの発生が通知され、エラー管理部46Bは、エラーの発生が通知されると、発生したエラーの種別・発生箇所等のエラー情報を取得し、動作しているコンピュータ(コンピュータ10)の種別や構成等を表す装置環境情報を記憶部20から取得し、取得した装置環境情報が表す装置環境に応じたエラー通知方法を判断し、判断したエラー通知方法でエラーの発生を通知する。
また、アプリケーション32は、個々の処理管理部46の処理フロー管理部46Aから、管理対象のモジュール群における画像処理の実行終了が通知される毎に、通知元の処理管理部46の消去を指示する。これにより、管理対象のモジュール群で画像処理が終了した処理管理部46は、管理対象のモジュール群を構成する個々のモジュール(のプログラムを実行するスレッド)を消去すると共に、処理管理部46自身(のプログラムを実行するスレッド)も消去する消去処理を行うが、この消去処理の途中でリソース管理部46Cに一時的に制御が渡り、消去される個々のモジュールや処理管理部46(の処理フロー管理部46Aやエラー管理部46B)が確保していたメモリ領域等のリソースは、リソース管理部46Cを通じて全て解放される。
これにより、アプリケーション32のコーディングに際しては、画像処理の実行終了が通知される毎に処理管理部46の消去を指示するコードを記述するのみで、構築を指示した画像処理部50の生成に伴って確保されたリソースを確実に解放することができ、個々のモジュールが確保していたリソースの解放を指示するコードの記述漏れに伴って一部のリソースが解放されずに有効利用率が低下してしまうことを防止することができる。なお、上記の消去処理を行う処理管理部46は、リソースの解放を行うリソース管理部46Cと共に請求項4に記載の消去処理手段に対応している。
なお、上記では独立して並列に動作可能な個々のモジュール群を単位として、処理フロー管理部46Aを備えた処理管理部46を各々生成する態様を説明したが、本発明はこれに限定されるものではなく、処理管理部46自体は1個のみ設け、個々のモジュール群を単位として処理フロー管理部46Aを各々生成するようにしてもよい。これは、先に説明した処理管理部生成処理(図4)のステップ112において、処理管理部46は追加生成せずに処理フロー管理部46Aを追加生成することによって実現できる。例として図6には、図5(A)に示す画像処理部50に対し、個々のモジュール群を単位として処理フロー管理部46A及びエラー管理部46Bを各々生成した態様を示す。この態様においても、個々の処理フロー管理部46Aの管理テーブルのサイズを小さくすることができるので、管理テーブルの検索に要する時間を短縮することができる。
また、上記では画像処理部50が分岐モジュールを含んで構成されている場合に、図7(B)に示すように、分岐モジュールの後段(次段)の複数のモジュールを各々先頭とする複数のモジュール群について、対応する処理管理部46(処理フロー管理部46A)を各々設ける態様を説明したが、本発明はこれに限定されるものではなく、例として図8に示すように、分岐モジュールの後段(次段)の複数のモジュールのうちの何れか1つのモジュールを先頭とする単一のモジュール群については、分岐モジュールを含むモジュール群と統合し、統合後のモジュール群に対応する処理管理部46(処理フロー管理部46A)を設けるようにしてもよい。
また、上記では処理管理部46(処理フロー管理部46A)を、画像処理部50を構成するモジュール群と同数設ける態様を説明したが、本発明はこれに限定されるものではなく、複数の処理管理部(処理フロー管理部46A)のうちの1個以上の処理管理部(処理フロー管理部46A)については、複数のモジュール群を管理対象とするようにしてもよい。この場合、処理管理部46(処理フロー管理部46A)の数はモジュール群の数よりも少なくなるが、本発明はこのような態様も権利範囲に含むものである。
更に、上記では画像処理部50を独立して並列に動作可能な個々の複数のモジュール群に分割する態様を説明したが、本発明はこれに限定されるものではなく、例えば個々のモジュール群は独立して動作可能であれば並列に動作可能でなくてもよいし、個々のモジュール群が独立して動作可能であるか否かと無関係に、個々のモジュール群を構成するモジュールの数が平均化されるように複数のモジュール群に分割したり、個々のモジュール群における負荷、或いは処理時間が平準化されるように複数のモジュール群に分割する等、複数のモジュール群への分割には任意の分割規則を適用可能である。
また、上記では処理管理部46(処理フロー管理部46A)の追加生成を画像処理部50の生成と並列に行う態様を説明したが、本発明はこれに限定されるものではなく、画像処理部50の生成が完了した後に、生成が完了した画像処理部50を複数のモジュール群に分割し、画像処理部50を複数のモジュール群に分割した結果に基づいて、処理管理部46(或いは処理フロー管理部46A)を複数の処理管理部46(或いは複数の処理フロー管理部46A)に分割するようにしてもよい。
また、上記では本発明に係る画像処理プログラムに対応する画像処理プログラム群34が記憶部20に予め記憶(インストール)されている態様を説明したが、本発明に係る画像処理プログラムは、CD−ROMやDVD−ROM等の記録媒体に記録されている形態で提供することも可能である。