前回奥行き情報を(一応)推定する事ができたので、そろそろ 3D にしてみようと思う。
本日のターゲットは、このどうしようもない写真。

これを、Kinect で適当に 3 次元復元して俯瞰したら、こうなった。

※ ちなみにぼくの隣は博士様の席なのだ。






#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 から労せずしてカメラ映像を取得する事ができるようになった。