ismについての概要説明


Counter : 77943

ismとは?

 私(サイバラ)が作った、「動画像(映像)処理をできるだけ簡単にしよう」との コンセプトによる、一連のシステムです。 現時点ではWindows専用ですが、 OS非依存なのでLinuxにも比較的簡単に作成可能と思います。
 概要としては、共有メモリ上に画像データを置くことで、 画像処理(動画処理)環境がものすごく簡単に実現できそうなので、 この仕組みを安定的に構築維持できれば良いなと思っているところです。

なぜismを作ったか?

 巷にはOpenCVやDirectShow、VideoForLinux2(V4L2)など、リアルタイムで動画 を扱うためのライブラリがたくさん存在します。しかしながらその一方で、 これらのプログラム環境は開発環境のセットアップが非常に複雑になりがちで、 簡単に開始できる状態ではありませんでした。
 特に私の場合は趣味や仕事の上で、 動画を扱うプログラムを多く作成しなければならない状態だったのですが、 例えばOpenCVでバージョン違いで動かなかったり、 DirectShowがWindowsSDKに飲み込まれて見かけ上消滅してたり、 32bit版OSでは動いても64bit版OSでは動かなかったりと、 とにかく画像処理の本質的でない、 環境のセットアップの時点ですごく手間がかかる状態でした。
 そこで、そういったハードウェア依存、OS依存になる部分は極力別枠にして、 純粋にデフォルト(標準)環境のみで画像処理プログラムが組めること、 を目標に今回のismシステムを構築しました。 (とはいえ、VisualStudioなどの開発環境は結局必要ですけど・・・)
 もちろん、簡単にするためにある程度犠牲になった部分もあって、 高負荷であることや、フレームレート同期性に若干問題のある点が挙げられます。

ismの名前の由来

 名前は元々は単純に「Images in Shared Memory」の頭文字を 取っただけですが、開発当時、富山県の射水市に引っ越したばかりで、 射水市の癒し系?キャラクター 「イミズムズムズ」が目についていたため、そんな語呂に魅かれた のかもしれません。
 とりあえず作者としては英語表記では「ism」、 読みは「イズム」で良いと思ってます。 プログラム名も基本的に「〇〇イズム」、という読み方にできると思います。

使用にあたって

 現時点では、基本的に「コマンドプロンプト」が使えることが前提となっ ています。そのため、導入にあたっての敷居が高いと思います。 また、作成者である私自身もまだまだWindows上のプログラミングについて 充分に理解・成熟できていない部分も多いので、一応安定動作を目指していますが、 場合によっては問題が発生する場合もあるかと思います。
 もし問題が発生した場合、その時の状況を含めて連絡頂ければ、 原因が分かり次第、出来る限り対処していきたいと思いますので、 気軽にバグレポートください。使ってるよ〜っていう連絡でも 作者はおおいに喜びます(謎)
 基本的には画像のみを扱いますので、セキュリティ上の問題は少ないと思います。 ですが、例えばスクリーンキャプチャした画像を裏でこっそりインターネット上 に転送するなどした場合、Web画面での入力画面の転送などによる情報漏洩など、 使用者本人の意図しない目的で利用可能なことが想定されます。
 基本的にここで公開するプログラムは「コマンドプロンプト」もしくは 「モニタのためのウィンドウ」が必ず出現するようにすることで、 プログラムの存在が分かるようになることで、対策としています。 しかし、最初からコマンドプロンプトを出さずに起動することも 場合によっては可能であるため、このような対策には限界があります。
 作者としてはこのような物理的金銭的心理的な損害を与えるような利用は 望みませんし、皆さんもそのようなことに使用されないようにお願いします。

ソースの再利用について

 基本的にはフリー利用としますが、他人や本システム自体に損害を与えることを 目的とした利用や改変は禁止とします。 (例えばism_data.h(ismデータ)の構造体や定数を勝手に変更するなどした場合、 本システムで使用する各アプリケーションの互換性が取れなくなり、 事実上使用不能となってしまいますので禁止とします)
 本当はGPLとかいろいろ宣言すれば良いんでしょうけど、 複雑なことは避けたいので基本的にはPDS(パブリックドメインソフト)として、 後は皆さんの良心におまかせしたいと思います。

ismの概念

 「Images in Shared Memory」の名前が示す通り、理屈としては 単純に「共有メモリ」内に「画像データ」が保存できるようにした仕組み です。共有メモリはIDと呼ばれる「文字列」で管理します。
 1つのIDにつき、共有メモリ上に1枚分の画像データを保持しています。 ID(文字列)は自由に指定可能です。また、複数のIDを作成することで、 複数のismデータを作成可能です。
 各ism画像サイズは動作中は完全に固定です。 サイズの変更は動作中は無理と思ってください。 サイズ自体は最初に共有メモリデータ内で作成したプログラムにより決定されます。 後で別のプログラムが同じIDを指定して、 最初に作成されたサイズと異なるサイズで 使用しようとした場合はエラーになります。

ismの構成

基本構成を下に示します。

ここでは、中央に「ism_vga」というIDのismデータがあり、 左側が入力して「ism_vga」に書き込むプログラム、 右側が「ism_vga」から読み出してウィンドウ表示したり、 bmpファイルに書き込んだりするプログラムになります。
 例えば、単純にカメラから画像を取り込んで表示するだけの場合、 コマンドプロンプトを2つ出して、 それぞれのウィンドウで以下のコマンドを実行すればOKです。
scapture_ism.exe ism_vga 0 640 480 30
show_ism.exe ism_vga 640 480
ここで注意して欲しいのは、各プログラム間でやりとりする画像サイズ(640x480) を必ず統一してください。 画像サイズが各プログラム間で異なる場合、上記したように後で実行された プログラムがエラー終了するようになっています。 先にismデータが確保されていれば、2つ目以降に起動するプログラムはサイズ 指定しなくても(0x0の指定)動作するようにしています。(一部例外あり) ただ、後述するようにbatファイルなどで高速に連続実行した場合、 最初のプログラムの初期化が間に合わなくて 先に確保したismの画像サイズが、後のプログラムで読み出せなくて、 エラー終了することがあるので、可能な限り画像サイズを指定するのが 無難かもしれません。
ismデータは共有メモリですので、最初に実行されるプログラムが確保し、 これを利用するプログラムが1つでも存在する限り、維持されます。 逆に言えば、共有メモリを使う全てのプログラムが終了すると、 自動的に消滅します。
ismデータ同士の画像変換プログラムを下に示します。

ここでは、IDが「ism_input」というismデータから画像を読み出し、 変換して、「ism_output」のismデータに書き出すプログラムを示しています。

簡単な構成例として、以下の構成を挙げます。

これを実現するには、コマンドプロンプトを3個立ち上げて、 それぞれのウィンドウで以下のコマンドを順番に実行すればOKです。
scapture_ism.exe ism_tmp 0 640 480 30
reverse_ism.exe ism_tmp 640 480 ism_vga
show_ism.exe ism_vga 640 480
なんとなくでも、使い方は分かりますでしょうか。

なお、バッチファイル等でこれらを一気に起動する場合、 その中身は以下のようにしてください。 startを付けないと、全てのコマンドが同時に動作できなくなってしまいます。
start scapture_ism.exe ism_tmp 0 640 480 30
start reverse_ism.exe ism_tmp 640 480 ism_vga
start show_ism.exe ism_vga 640 480
2個目以降のプログラムで、画像サイズの指定をしなくても良いようにする方法 を実現しました。0 0 を指定した場合、既に存在した場合にそのサイズを読み込 んで処理を開始します。(既に存在しなかった場合はエラー終了します)
start scapture_ism.exe ism_tmp 0 640 480 30
wait_ism ism_tmp
start reverse_ism.exe ism_tmp 0 0 ism_vga
wait_ism ism_vga
start show_ism.exe ism_vga
以下、応用例を載せます。



詳細についてはまだプログラムを公開してないのでのちほど・・・
E-mail address : saibara@big.or.jp