zoukankan      html  css  js  c++  java
  • OpenNIDataGet 获取点云数据

    运行后,采集的数据保存到: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();
    }
  • 相关阅读:
    python学习之控制流1
    python学习之字符串转换
    python学习之数据类型与运算符号
    python之获取微信好友列表并保存文档中
    python之微信自动发送消息
    python之微信好友统计信息
    java并发编程--AtomicInteger
    java.time学习
    chrome插件
    classpath和classpath*
  • 原文地址:https://www.cnblogs.com/2008nmj/p/7360899.html
Copyright © 2011-2022 走看看