こんにちは 私はキネクトと私の仕事についての短い記事を提供したいと思います。
現在、キネクトを使用する広告プロジェクトの一部を行っています。 タスクの1つは、群衆の中の1人を「フィルタリング」することです。 これについてお話します。
私は仕事でOpenNI、OpenCV、Visual Studio 2010を使用しています。
開始する
以前は、画像と密接に連携したことはなかったため、どちらの側に取り組むべきか分かりませんでした。 いくつかの審議の後、次のスキームが登場しました。
1-通常のカメラから写真を取得します。
2-userPixels(ユーザーに属するピクセル)を取得します。
3-写真のコピーを作成し、フィルターを適用します。
4-「カスタム」としてマークされたピクセルは、フィルターを使用して画像から元の画像に再描画されます。
おおよその計画は明確です、行きましょう!
必要な変数を宣言します。
xn::Context context; xn::ImageGenerator imageGenerator;
実際、すべてを開始する準備ができました。 ジェネレーターを作成します。
int main(){ outputMode.nFPS = 10; outputMode.nXRes = 640; outputMode.nYRes = 480; XnStatus rc; pTexMap = NULL; pTexMapX = 0; pTexMapY = 0; rc = context.Init(); checkStatus(rc, " create context");
次に、重要なことをする必要があります。 カメラは互いに隣接して配置されていますが、1か所に配置されていないため、画像が異なります。 1つのビューを表示するために、特別なSetViewPointメソッドがあります。 コマンドStartGeneratingAll()を指定した後に使用できます。 そして、両方のカメラのOutputModeが同じであることが重要です。同じでないとエラーが発生します。
int main (){ ..... imageGenerator.SetMapOutputMode(outputMode); depthGenerator.SetMapOutputMode(outputMode); imageGenerator.SetPixelFormat(XN_PIXEL_FORMAT_RGB24);
フレーム処理
メインループでshowVideo()の記述を開始する前に、カメラからの画像を変換する必要があります。このため、XnRGB24PixelからIplImageを描画する関数を記述し、ユーザーに属するピクセルを決定します。
void fromXnRGBToIplImage(const XnRGB24Pixel* pImageMap, IplImage** iplRGBImage) { userGenerator.GetUsers(aUsers,nUsers); userGenerator.GetUserPixels(aUsers[0],userPixels); pLabels = userPixels.Data(); for(int l_y=0;l_y<XN_VGA_Y_RES;++l_y)
コールバックとshowVideoメソッドを書くことは残っています:
void XN_CALLBACK_TYPE gotUser(xn::UserGenerator& generator, XnUserID nId, void* pCookie) {
まとめ
その結果、次のようになります。

以下のスクリーンショットは、境界線を増やして、目標にわずかに調整した結果を示しています。

ありがとう、成功!