http://0ba38758174010h.blogspot.com/2011/01/playstationeye-ps3eye-processing.html の続き。
無事PlayStationEyeを複数同時利用出来る環境が整った、と思いきや2つまでしか認識されないという事態に直面した前回。
3つ以上使うためにはcreditを購入して接続したカメラのUUID毎にactivateしてあげなきゃいけない。
2月末にはsonyからSDKが配布されるかもしれないという話があるものの、もはや本番まで1ヶ月という現状でそんなものを待つわけにもいかず、買っちゃうことにした。で、買った。4credit。35$。時間は金に変えられねえ。3000円何ざおしかねえぜ。
でまあ、結果としてきちんと動いた。その経過と報告。
どうやってアクチベーションするか。以下手順。
1.まずはcodelaboratoryのサイト行ってアカウントを取る。
2.PS3Eyeがたくさんつながってる状態で、"CL-Eye Device Manager.exe"を起動。"C:\Program Files\Code Laboratories\CL-Eye Driver"にある。つないでる数の分だけウィンドウに項目が表示されてるのを確認しよう。
3.左下のActivateDevicesを押す。アカウントとパスワード入れてログイン。デバイスごとにActivateするか否かを選択できる画面になる。ここで、creditがあればその数だけPSEyeをactivate出来る。でもまだcreditはない。ので買う。
4.右下のAddCreditsを押す。サイトに飛ぶ。ここで、購入したい数のcreditを選んでBuyを押す。支払いはペイパル。購入した分だけアカウントにcreditが加算されていく。ゲーセンの筐体にコイン入れてクレジットが増えるのと一緒。
5.もっかい"CL-Eye Device Manager.exe"開いて、さっきのactivateの画面まで進む。activateしたいカメラを選んで右下のactivate selected Camerasかなんかを押したらおk.。一度activateしたカメラはアカウントに残るので、どのPCにつないで使ってもActivatedなものとして扱われる。壊れたらおしまい。activatedからはずしてcredit戻してもらうこともできるんかな?わかんね。
6.動作確認。全部つながってる状態で、"C:\Program Files\Code Laboratories\CL-Eye Platform SDK\Redist"の中の"CLEyeMulticamTest.exe"を起動。つなげてる分だけカメラのキャプチャウィンドウが開いたらおk.。
7.ここが大事。"C:\Program Files\Code Laboratories\CL-Eye Platform SDK\Redist"の中に"CLEyeMulticam.dll"が入ってることと思う。activateされてるか否かを判断してカメラの数を決めてるのはこいつ。"C:\Program Files\Code Laboratories\CL-Eye Platform SDK\Bin"の中の"CLEyeMulticam.dll"にその機能はない。こいつは最大接続数2に制限してる。Redistフォルダの中の奴を使わないと3つ以上使えない。activateが意味を成さない。ので、単純に取り替える。既にeclipseの当該プロジェクト内のlibNativeフォルダにCLEyeMulticam.dllが入ってることと思う。まずはeclipse上からこいつを削除する。んで、改めて件のRedistフォルダ内のCLEyeMulticam.dllをインポートする。さて、とりあえずカメラを3つ以上使うプログラムを作って起動してみよう。たぶん動いたことと思う。たぶん。
せっかくなんで複数動作の起動確認用に作ったプログラムを此処に載せる。eclipseに貼りつけてピッとしたらちょちょっと動くはず。上下キーでカメラ切り替え。うまく動いたらcameraCount()はつなげてるPSEyeの台数を返してくれるはず。俺の場合は4.。
以下コード。
________________________
import processing.core.*;
import cl.eye.*;
public class PSEye_multi_test extends PApplet{
int CAMS_NUM = CLCamera.cameraCount();
CLCamera myCams[] = new CLCamera[CAMS_NUM];
PImage myImgs[] = new PImage[CAMS_NUM];
int CAM_RESOLUTION = CLCamera.CLEYE_QVGA;//CLEYE_QVGA/VGA
int CAM_WIDTH;
int CAM_HEIGHT;
int EXPECTED_FRAMERATE = 60;
int focused_cam = 0;
void setupCameras(){
if(CAM_RESOLUTION == CLCamera.CLEYE_VGA){
CAM_WIDTH = 640;
CAM_HEIGHT = 480;
}
else if(CAM_RESOLUTION == CLCamera.CLEYE_QVGA){
CAM_WIDTH = 320;
CAM_HEIGHT = 240;
}
if(CAMS_NUM == 0){
System.out.println("no PSEye founded.");
System.exit(-1);
}
System.out.println("Found " + CLCamera.cameraCount() + " PSEyes.");
// create cameras and start capture
for(int i = 0; i < CAMS_NUM; i++)
{
// Prints Unique Identifier per camera
System.out.println("Camera " + (i+1) + " UUID " + CLCamera.cameraUUID(i));
myCams[i] = new CLCamera(this);
// ----------------------(i, CLEYE_GRAYSCALE/COLOR, CLEYE_QVGA/VGA, Framerate)
myCams[i].createCamera(i, CLCamera.CLEYE_COLOR_PROCESSED, CAM_RESOLUTION, EXPECTED_FRAMERATE);
// Starts camera captures
myCams[i].startCamera();
myImgs[i] = createImage(CAM_WIDTH, CAM_HEIGHT, RGB);
}
}
@Override
public void setup(){
setupCameras();
size(CAM_WIDTH, CAM_HEIGHT);
frameRate(EXPECTED_FRAMERATE);
}
@Override
public void draw(){
// --------------------- (image destination, wait timeout)
myCams[focused_cam].getCameraFrame(myImgs[focused_cam].pixels, 0);
myImgs[focused_cam].updatePixels();
image(myImgs[focused_cam], 0, 0);
// println(frameRate);
}
public 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;
}
}
}