运行后,采集的数据保存到:E:OpenCVData目录下的color和depth文件夹下。
接下来要求参数:内参 外参 这些参数最好优化后使用精度高
如何得到+保存格式
yaml
保存文件格式:
1. 索引
2. 数据
3. 数据
4.。。。
其中copenni类是一个OPENNI对象类
#include <XnCppWrapper.h> #include <QtGui/QtGui> #include <iostream> using namespace xn; using namespace std; class COpenNI { public: ~COpenNI() { context.Release();//释放空间 } bool Initial() { //初始化 status = context.Init(); if(CheckError("Context initial failed!")) { return false; } context.SetGlobalMirror(true);//设置镜像 //产生图片node status = image_generator.Create(context); if(CheckError("Create image generator error!")) { return false; } //产生深度node status = depth_generator.Create(context); if(CheckError("Create depth generator error!")) { return false; } //视角校正 status = depth_generator.GetAlternativeViewPointCap().SetViewPoint(image_generator); if(CheckError("Can't set the alternative view point on depth generator")) { return false; } return true; } bool Start() { status = context.StartGeneratingAll(); if(CheckError("Start generating error!")) { return false; } return true; } bool UpdateData() { status = context.WaitNoneUpdateAll(); if(CheckError("Update date error!")) { return false; } //获取数据 image_generator.GetMetaData(image_metadata); depth_generator.GetMetaData(depth_metadata); return true; } public: DepthMetaData depth_metadata; ImageMetaData image_metadata; private: //该函数返回真代表出现了错误,返回假代表正确 bool CheckError(const char* error) { if(status != XN_STATUS_OK ) { QMessageBox::critical(NULL, error, xnGetStatusString(status)); cerr << error << ": " << xnGetStatusString( status ) << endl; return true; } return false; } private: XnStatus status; Context context; DepthGenerator depth_generator; ImageGenerator image_generator; };
main是主类
#include <QtCore/QCoreApplication> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <opencv2/core/core.hpp> #include "copenni.cpp" #include <iostream> using namespace cv; using namespace xn; string Int_to_String(int n); int main (int argc, char **argv) { COpenNI openni; if(!openni.Initial()) return 1; namedWindow("color image", CV_WINDOW_AUTOSIZE); namedWindow("color edge detect", CV_WINDOW_AUTOSIZE); namedWindow("depth image", CV_WINDOW_AUTOSIZE); namedWindow("depth edge detect", CV_WINDOW_AUTOSIZE); if(!openni.Start()) return 1; char key=0; int i=0, j=0; while((i==0)) {//key!=27 if(!openni.UpdateData()) { return 1; } /*获取并显示色彩图像*/ Mat color_image_src(openni.image_metadata.YRes(), openni.image_metadata.XRes(), CV_8UC3, (char *)openni.image_metadata.Data()); Mat color_image; cvtColor(color_image_src, color_image, CV_RGB2BGR); imshow("color image", color_image); //保存彩色图像 j = i++; string str1 = "E:\OpenCVData\color\"; string str11 = "E:\OpenCVData\depth\"; string str2 = ".jpg"; string str3 = str1 + Int_to_String(j) + str2; //彩色图像名称 char * cstr = new char [str2.length()+1]; std::strcpy (cstr, str2.c_str()); cout<<cstr; //cvSaveImage(cstr, color_image); imwrite(str3, color_image); /*对色彩图像进行canny边缘检测并显示*/ Mat color_image_gray, color_image_edge; cvtColor(color_image_src, color_image_gray, CV_RGB2GRAY);//因为在进行边缘检测的时候只能使用灰度图像 Canny(color_image_gray, color_image_edge, 5, 100); imshow("color edge detect", color_image_edge); /*获取并显示深度图像*/ Mat depth_image_src(openni.depth_metadata.YRes(), openni.depth_metadata.XRes(), CV_16UC1, (char *)openni.depth_metadata.Data());//因为kinect获取到的深度图像实际上是无符号的16位数据 Mat depth_image, depth_image_edge; depth_image_src.convertTo(depth_image, CV_8U, 255.0/8000); //对齐? imshow("depth image", depth_image); //保存深度图像 string str4 = str11 + Int_to_String(j) + str2; //深度图像名称 imwrite(str4, depth_image); /*计算深度图像的canny边缘并显示*/ Canny(depth_image, depth_image_edge, 5, 100); imshow("depth edge detect", depth_image_edge); key=cvWaitKey(30); } } string Int_to_String(int n) { ostringstream stream; stream<<n; //n为int类型 return stream.str(); }