2013年9月21日土曜日

PERC to OpenCV その3

わけがあり、Intel Perceputual Computing SDK (PERC SDK)を触ることになったが、情報がいまひとつ少ない。depth imageがほしいだけなので、PERCとOpenCVのブリッジを作成し、OpenCVで処理することとした。

depthイメージの取得方法をどうするか考えていたがintelにサンプルと説明のページがあったので、それをベースにすることにした。ページの最後にソースがあるので取得する。

環境さえできていればそのまま動かすことができるはずだが、初期化ではまってしまった。
原因は、カメラをPCのUSB1.0の口ににさしていたためであり、2.0の口に変えることで無事動作した。

BackgroundMaskCleanerは、depth画像にノイズが多い場合にノイズを減らすものである。
中の処理は、MorphologyExを使用してopenとcloseを行っている。
なぜかcで記述しているので自分で書き直したほうがよいだろう。

原理は、説明のページに書かれているが、急いでいるのでBlackBoxとして使用するつもりだが、速度に関しては30fpsに届かないので、速度面でCaptureStreamの中身を調べてみる。

CaptureStreamを自分のプログラムに組み込めば距離情報でマスクされたカラー画像を得ることができる。これでようやくめどがついた。



2013年9月13日金曜日

PERC to OpenCV その2

一月ほど開いてしまったが、締め切りが迫ってしまい、少しお尻に火がつき始めた。

わけがあり、Intel Perceputual Computing SDK (PERC SDK)を触ることになったが、情報がいまひとつ少ない。depth imageがほしいだけなので、PERCとOpenCVのブリッジを作成し、OpenCVで処理することとした。

PERCでは、MatにあたるクラスがPXCImageとなる



ようやくRGBの変換方法がわかった。エラー処理は抜いている。

UtilPipeline pp;
PXCImage* pImage;
PXCImage::ImageData imageData;
cv::Mat    matRGB = cv::Mat(cv::Size(640, 480), CV_8UC3);

pp.EnableImage(PXCImage::COLOR_FORMAT_RGB24, 640, 480);
pp.Init();
pp.AcquireFrame(true);
if (pImage->AcquireAccess(PXCImage::ACCESS_READ, PXCImage::COLOR_FORMAT_RGB24, &imageData) >= PXC_STATUS_NO_ERROR)
{
    memcpy(matRGB.data, (uchar*)imageData.planes[0], 640*480*3*sizeof(uchar));
}
pp.ReleaseFrame();

これで、matRGBにカラーデータが格納される

複数からアクセスされることを想定しているため、イメージのリソースにアクセスする前に、調停を行い、アクセス権を取得しなければいけない。また、アクセス権は、短時間で開放しないといけないので、1フレーム毎に、アクセス権が必要となる。

少しめんどくさいし、アクセス権取得のオーバヘッドはどれくらいなのだろうか?
また、他のアプリは想定していないので、アクセス権が取れない場合を想定していないが、まじめに考えるとエラー処理が必要となる。