2010年12月20日月曜日

processingのCaptureライブラリ代替ライブラリCaptureDSでカメラを2つ使う。てかマルチカメラ。

processingでwebカメラを使う場合、普通は標準のCaptureクラスを使ってることと思う。
QTJava使って動いてるあれだ。
WinVDIGがないと動かないというあれだ。
こんなん遅すぎやわ、絵面汚いわで使ってられへんわ―て人は多いみたいで、JMyronだのOpenCVだのと色々と代替キャプチャークラスは提供されている。
今回表題にしているCaptureDSもその一つである。
JavaでDirectShowを使うという目的で開発されたDirectShowJavaというのがあるのだが、これはそれをベースにprocessing用に仕上げられたものである。
その特徴は絵面が奇麗で動作が軽い、ということ。これに尽きる。
NyAR4psgでもこいつの利用が推奨されている。

だいぶ前に私も実際に使ってみた。
その感想は単体で使う分にはこれ以上はないというぐらい申し分ない性能だな、ということ。
単体で使う分には、ね。
なにが不満かといえば、複数では使えないということだった。
複数のカメラを同時に使おうとするとなにやらエラーが出て止まる。
解決策をググってみたり色々と試してみたりするもしおしおのパーで、当時は一旦あきらめたのであった。
なんでそんなことにこだわったかってそういう研究だったからね。カメラ複数台使う必要があったのよ。
結局標準のCaptureクラスをcam.settings()を挟むという旧バージョンでは定石の手法でもってその場は乗り切った。

で、ここまでが1年くらい前の話で、今に至る。
そんときがXPで今は7だって言うのはまあおいとこう。
今しがたなんとはなしにもっかい使ってみたのよ、CaptureDS。
まああいかわらず単体ではきれいだしはやいわな、2つ繋いでみるとやっぱエラー出るな、あはは。
でそこで出たエラーがなんやら、Audio device is busy RealtekHD****だかそんなんですよ。
ここで俺はふと思ったんだ。

そういやこのカメラ(ロジクールのやつ。内蔵マイク付き。QCam Pro for notebooksだかそんなん。それとQCam fusionだかってやつの2つでね。←ここ重要。後述する。)マイク付いてたなあ、案外無効にしたら動いたりして(笑)

でまあ、スタートメニューのデバイスとプリンターのところから当該カメラのサウンドの設定ってのを押してだな、録音タブのところそれっぽいマイクを右クリで無効にしてやったのよ。

そしたらなんとね、動いたの。2つ。同時に。
なんか、人ってすごいなあって思ったね。

あ、ちなみにこれ全部2008年版のCaptureDSでの話ね。
2010年版ではなんか知らんけど動作が変だから。単体でも。
あえてリンクは載せてないけど使いたい人は適当にぐぐってゲットしてチョ。
使い方も本家に書いてあるから分かるはず。
ああ、そういうわけで旧版を使うのをお勧めする。
その場合dsj.jarとdsj.dllも古いバージョンを用意しないと動かないから注意ね。
2008年リリースぐらいの版を使えば動くと思うよ。
スクショ乗せたいけどめんどいンでそれはまあいいや。

__________________________________

あああああああああああああああああ
くそったれ。
たしかにに問題なく使えたよ。
2つのカメラが異なる製品の場合はな!
使用するカメラの区別はカメラに付与されたデバイス名で指定できるんだけどさ、同じカメラ2つ使った場合これが区別されないのな。どっちとも”QcamPro for notebooks”の場合、CaptureDS.list[0]もCaptureDS.list[1]も区別されないのな。結局コンストラクタに渡される引数は同じってことになって衝突、device is busyでエラー。
さてどうしたもんか。
デバイス名いじれれば手っ取り早いんですけどね。
__________________________________

ひとつ考えたのが”QcamPro for notebooks”みたいなストリング型じゃなくてDSFilter型の何かを突っ込んでやれば案外区別できるんじゃね?って話。
CaptureDSの中身をeclipseで見てみりゃわかるんだけど、当該の引数をObject型で受け取った後にDSFilter型かそれ以外か、で処理を分けてるからね。
どうすりゃいいのかはわからん。忙しいんで試してない。

とりあえずせっかくなんで2台以上のカメラをつなぐプログラムのソースでものっけちゃおうかな。
processingIDE上にそんまま張っ付けりゃ動きます。上述のとおりCaptureDSとdsjが導入してあるならね。

使い方:
2つ以上のカメラをPCに繋ぐ。つなぐカメラは、異なるデバイス名でPCに認識される組み合わせとなる物であることが動作条件。マイク内蔵型の場合は、windows7なら「デバイスとプリンター」から当該カメラのプロパティの録音タブを開いてマイク機能を無効にしておくこと。 
うまく起動した場合は、↑↓キーでカメラの切り替えができるはず。
繋げるカメラの台数は無制限。






import processing.video.*;

//デバイス名が同じになる場合は複数同時使用不可
int CAMS_NUM = CaptureDS.list().length - 1;
CaptureDS[] caps = new CaptureDS[CAMS_NUM];
int CAP_WIDTH = 640;
int CAP_HEIGHT = 480;
int EXPECTED_FRAMERATE = 60;

int focused_cam = 0;

void setup() {
  size(CAP_WIDTH, CAP_HEIGHT);
  println(CaptureDS.list());
  for(int i=0; i < CAMS_NUM; i++) caps[i] = new CaptureDS(this, CAP_WIDTH, CAP_HEIGHT, CaptureDS.list()[i], EXPECTED_FRAMERATE);
  frameRate(EXPECTED_FRAMERATE);
}

void draw() {
  caps[focused_cam].read();
  image(caps[focused_cam], 0, 0);
  println(nfc(frameRate, 2));
}

void keyPressed(){
  if(keyCode==UP){
    focused_cam++;
    if(focused_cam==CAMS_NUM) focused_cam=0;
  }
  if(keyCode==DOWN){
    focused_cam--;
    if(focused_cam==-1) focused_cam=CAMS_NUM-1;
  }
}


______________________________

追記: 2011/02/06

processingで複数のカメラを高速に使いたいんならPlayStationEye (PS3Eye)を使うべき。それが今の俺の結論。あとeclipse使うべき。標準IDEは糞。

理由:60fps動作可能。安い。ライブラリも高速。

詳細:  http://0ba38758174010h.blogspot.com/2011/01/playstationeye-ps3eye-processing.html
______________________________

0 件のコメント:

コメントを投稿