2011年9月22日木曜日

OpenNIでRGB画像と深度画像の取得

Kinectを使う上で最も基本的なことはRGB画像と深度画像を取得することです。

まずこのRGB画像と深度画像を取得しOpenCVで表示してみましょう。

環境
Windows 7 32bit
Microsoft Visual Studio 2010
OpenCV2.2
OpenNI

では、Visual Studioの設定から行います。


まず、プロジェクトを作りましょう。

メニューバーの「ファイル」→「新規作成」→「プロジェクト」




「新しいプロジェクト」から「Win32 コンソールアプリケーション」を選びます。




「名前」に好きなプロジェクト名(ここではGetImageAndDepthにしました)
場所にプロジェクトを保存するディレクトリ名を入力します。

すると、「Win32 アプリケーション ウィザード」というのが出てきます
とりあえず「次へ」を押し 「アプリケーションの設定」で
 「追加のオプション」にある「空のプロジェクト」にチェックを入れます。


そして完了。

「空のプロジェクト」にチェックを入れたので何もありません。
作っていきましょう。



メニューバーから「プロジェクト」→「新しい項目の追加」から
「C++ファイル(.cpp)」を選びます。

名前は適当に「main」でも。

次にインクルードディレクトリの設定を行います。

メニューバーから「プロジェクト」→「(プロジェク名)のプロパティ」 を開きます

構成を「アクティブ(Debug)」から「すべての構成」に変更

「構成プロパティ」→「C/C++」→「全般」を開く

「追加のインクルード ディレクトリ」 の右側をダブルクリック
「追加のインクルード ディレクトリ」に
「C:\Program Files\OpenNI\Include」
「C:\OpenCV2.2\include」
を設定する
 


 で、準備オッケー


ではプログラムを書いていきます。

#include <opencv2/opencv.hpp>
#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")            // opencv_core
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")        // opencv_imgproc
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")        // opencv_highgui
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")    // opencv_objdetect
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")            // opencv_ml
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")    // opencv_features2d
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")        // opencv_video
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")        // opencv_calib3d
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")        // opencv_flann
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")        // opencv_contrib
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")        // opencv_legacy
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")            // opencv_gpu
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib")            // opencv_core
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")        // opencv_imgproc
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")        // opencv_highgui
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")    // opencv_objdetect
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")            // opencv_ml
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")    // opencv_features2d
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")        // opencv_video
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")        // opencv_calib3d
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")        // opencv_flann
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")        // opencv_contrib
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")        // opencv_legacy
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")            // opencv_gpu
#endif

#include <XnCppWrapper.h>
#pragma comment(lib,"C:/Program files/OpenNI/Lib/openNI.lib")

#define SAMPLE_XML_PATH "C:/Program Files/OpenNI/Data/SamplesConfig.xml"
using namespace cv;
using namespace xn;

int main()
{
    Context context;
    EnumerationErrors errors;

    context.InitFromXmlFile(SAMPLE_XML_PATH);
  
    DepthGenerator depthGenerator;// depth context
    context.FindExistingNode(XN_NODE_TYPE_DEPTH, depthGenerator);
  
    ImageGenerator imageGenerator;//image context
    context.FindExistingNode(XN_NODE_TYPE_IMAGE, imageGenerator);

    DepthMetaData depthMD;
    ImageMetaData imageMD;

    Mat image(480,640,CV_8UC3);
    Mat depth(480,640,CV_16UC1);
    int key = 0;
    bool isWarp=false;
    while (key!='q')
    {
        //wait and error processing
        context.WaitAnyUpdateAll();

        imageGenerator.GetMetaData(imageMD);
        depthGenerator.GetMetaData(depthMD);
          
        memcpy(image.data,imageMD.Data(),image.step * image.rows);    //イメージデータを格納
        memcpy(depth.data,depthMD.Data(),depth.step * depth.rows);    //深度データを格納
              
        //convert color space RGB2BGR
        cvtColor(image,image,CV_RGB2BGR);      
      
        imshow("image",image);
        imshow("depth",depth);
        key = waitKey(33);
    }
    context.Shutdown();
    return 0;
}



これでRGB画像と深度画像を表示されたかと思います。




参考
Kinect Tips
画像処理ソリューション

0 件のコメント:

コメントを投稿