カメラ多すぎ
私が所属している研究室には多種多様な(博覧会か!というほどの)カメラが存在する.
超ミニカメラから,雲台付きカメラ,果ては全天候対応の屋外設置型カメラ(ワイパー付き)まである.
そんなカメラ王国になってしまった当研究室において目下最大の問題はカメラをソフトウェアで制御(主にキャプチャだけど)するスキルが不足しているという点だった.
開発
そこで私に下った指令は「カメラを簡単に扱えるソフトを作れ」だった.ここでいうソフトは「ライブラリ」だったり「サーバ」だったりするんだけど詳細は追々.
というわけで,PenTag という当研究室の切り札の一つ(注:他にもたくさんある)を再実装するという副次的な目標を掲げ1ヶ月余りにわたって開発し,作り上げたのがいくつかの DLL ライブラリでした.最終的にはサーバ(エージェントと呼んでいる)にしたかったんだけど通信規約ができず断念.
DLL の仕様とか
できあがった DLL は必要最低限の機能ながら,WDM も VfW もその他悪趣味なほど独自仕様のいくつかのカメラ画像取得 SDK も,単一のインタフェースで扱えるようにしてくれるもの.
個人的には .lib ファイルをインポートして使う一般的な DLL の仕組みが(VC++ のIDEの使い方も一緒に教える必要があるため)嫌いなので,LoadLibrary/GetProcAddress を呼び出すラッパークラスを作って,.h ファイルの include だけで使えるようにした.
サンプル
さて,そんな素敵 DLL 群もサンプルがなければ誰も使えない無用の長物っつーことでさくっとコンソールのサンプルを作ってみた.
最初は USB カメラ(俗に言う Web カメラ)から撮った画像のヒストグラムを表示するものだった.
0- 31: 42079: ********* 32- 63: 30620: ****** 64- 95: 27627: ****** 96-127: 48261: ********** 128-159: 20818: **** 160-191: 30642: ****** 192-223: 51807: *********** 224-255: 55346: ************
サンプル+
これだけだと面白くないんで,濃淡画像をコンソールに表示できないか,と.
やってみました.
「手を挙げろ!」
DOSプロンプトに表示するので白黒反転してます.
-------------***********************************************
-------****--***********************************************
**---------*-**********************************-************
--****-------**********************************-************
------------***********************************-************
****--------*****---******--*-******************************
----*--*----**-----------------*****************************
**---***-*-*--------------------*************-****-*********
*****---*-*-----------------------******--***-****-*********
*********-*-----------------------*******--**-****-***-*****
-*******-**-----------------------********-**--**--***-*****
--**-*-***------------------------********--**-**-***-******
--**-*----*-----------------------********--------**--******
------**-*------------------------****--***----------*******
-----**--*-*---------------------******--**----------*******
----**-***--*----------------*---******--------------*******
-----*-***-------------------*---*******-------------*******
--------**-------------------*-**********------------*****-*
-----***-------*-------------**************------------**-*-
----*--*---------------------***************------------***-
-------*------*--------------***************------------****
----*--*---------------------***************------------****
-------------------------------***-*********------------****
----------------------------*------**-*******-----------****
-----*-------------------**--------*----*-****----------****
サンプル++
2値だと面白くないよね.
せめて8値.とか思ってたら PitexWIN という同種のソフトがあることを先輩から知らされる.
アイデア拝借っつーことでやってみました.
.-.-..*---=-=*=8XXXXX#############XX##X#&&&&&&&&&&&&&&&&&&&&&&&&&
.....-==X8XX8*=8XXXXX############&8XX#88&&&&#&&&&&#-&&&&&&&&&&&&&&
8X&=-.-=--===8=8XXX=..-XX#########8X##X*##&&&&&&&&&.&&&&&&&&&&&&&&
-=XXXXX====-.--*...........-######8XX#X#&&&##&&&&&&8&&&&&&&&&&&&&&
=--....--.................-.-=####8##########&&&&&&&&&&&&&&&&&&&&&
*888*.........................8###XX####8#####&&&##&&&&&&&&&&&&&&&
.-=-...........................*##X######XX###=*=&&X*=8&&&&&&&&&&&
XX--............................X##8X#####X#X#****==*&&&&&&&&&&&
#XX.............------==-.......*#######XXX**X888X8***8&==*#&&&=*&&&&&
##&.........-------====***=-.....##########***8&&&&***8&8***&&&*=8&&&&
.##*......----------===888888-..##########*=*8&&=**#X=**#&&=*8&&&&
..#8*-...-==-----=--....=*88X*.-*=###########****#&&**8*X=**X&8=**&&&&
...-#=*...-...---------=*8=8X#==-8############****#&&*******8&***#&&&&
.-..--*X8..=------=--.--==88XX*X8##############******************#&&&&
.....*88-X=--=..-----=====**8XXX################*******8***8*****8##
...-88X*8X88*=--=====*====**88XX#################*****************###8
...-8XX-*X8#====--*==**====*88XX#&&&&&######***************8*##&&
...-*88==X88.====-------=-=*8888X.&&&&&&******&&&==****8********8**&
...-.*XX#-*.8*-.==-=---.---=*==**-&&&&#&*******=*****************&
.....=*=8==*--.#XX=------===-====-#&&&&&X###**********************8&
......-=X=-*8XXX8X**------======--X&&&&###X#X*******8**8*******==*
....*8-=*-X888XXXX8*.---=======--.#&&&&#XXX#XXXX##8************===--
....*=.-X88888888X88*----=-=-=---8X#X&&&XX#XXX8XXXXXXXXX==========X
.....-.X88888888*X888888---=----X#XXXX##X#XXXXXXX8XXXXXXXX88X*==----*X
.....XXXX888888*XX88X8XXXXXXXXXXX#XXXXXXXXXXXXXXX8#X8XX8XXXXXX8==-XX#X
こんな文字列が DOSプロンプトに表示されます.楽しそうでしょ!?
よーし,んじゃ下記URLをぽちっとしちゃってくれ!!
http://www.takke.jp/bin/ConsoleExample01.lzh
上記最新版にはこれにさらに連番でビットマップ画像&HTML版を保存する機能も付いてます.
で,一番言いたいのは,こんだけの機能をたった100行で(連番機能とか付けたら200行くらいになっちゃったけど)実装できちゃうってことです.同梱の WdmReader.DLL 君のおかげです.WdmReader.DLL 自体は DirectShow の COM でわけわかんねーコードの嵐なんで1000行近くあります.
コメントくださーい
09/18 追記:
ソースコードは近日公開予定.
11/09 追記:
http://www.takke.jp/soft/capi.html でソース公開しました.