前回奥行き情報を(一応)推定する事ができたので、そろそろ 3D にしてみようと思う。
本日のターゲットは、このどうしようもない写真。
これを、Kinect で適当に 3 次元復元して俯瞰したら、こうなった。
机上の本や PC はもちろん、部屋の隅っこの柱やパイプなどの凹凸がくっきり浮き出ている事が確認できる。
※ ちなみにぼくの隣は博士様の席なのだ。
#include<cv.h> #include<highgui.h> // ※インクルードパスに // 「C:\Program files\OpenNI\Include」 // を追加しておこう! #include<XnCppWrapper.h> #pragma comment(lib,"C:/Program files/OpenNI/Lib/openNI.lib") #define SAMPLE_XML_PATH "C:/Program Files/OpenNI/Data/SamplesConfig.xml" int main() { xn::Context context; xn::EnumerationErrors errors; context.InitFromXmlFile(SAMPLE_XML_PATH); xn::DepthGenerator depth; // 深度コンテキスト context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth); xn::ImageGenerator image; // イメージコンテキスト context.FindExistingNode(XN_NODE_TYPE_IMAGE, image); xn::DepthMetaData depthMD; xn::ImageMetaData imageMD; cv::Mat depthshow; cv::Mat show; int key = 0; bool isWarp=false; while (key!='q') { // waitとエラー処理 context.WaitAnyUpdateAll(); image.GetMetaData(imageMD); depth.GetMetaData(depthMD); // 画像と深度はOpenCVのMatに格納 cv::Mat depth16(480,640,CV_16SC1,(unsigned short*)depthMD.WritableData()); cv::Mat imni(480,640,CV_8UC3,(uchar*)imageMD.WritableData()); // RGB色空間をBGRに変換 cv::cvtColor(imni,show,CV_RGB2BGR); // 11ビット画像を8ビット画像に変換 depth16.convertTo(depthshow,CV_8U,-255/4096.0,255); cv::imshow("depth",depthshow); cv::imshow("image",show); key = cv::waitKey(33); } context.Shutdown(); return 0; }これで、Kinect から労せずしてカメラ映像を取得する事ができるようになった。