使用Kinect生成点云数据

        参考台湾Heresy大神的程序:

http://kheresy.wordpress.com/2011/01/25/build_3d_point_cloud_via_openni/

#include <XnCppWrapper.h>
#include <iostream>
#include <iomanip>
#include <vector>

using namespace xn; 
using namespace std; 

//point cloud data struct
struct SColorPoint3D
{
    float  X;
    float  Y;
    float  Z;
    float  R;
    float  G;
    float  B;

    SColorPoint3D( XnPoint3D pos, XnRGB24Pixel color )
    {
      X = pos.X;
      Y = pos.Y;
      Z = pos.Z;
      R = (float)color.nRed / 255;
      G = (float)color.nGreen / 255;
      B = (float)color.nBlue / 255;
    }
};

void GeneratePointCloud( DepthGenerator& rDepthGen,
                         const XnDepthPixel* pDepth,
                         const XnRGB24Pixel* pImage,
                         vector<SColorPoint3D>& vPointCloud )
{
    // number of point is the number of 2D image pixel
    DepthMetaData mDepthMD;
    rDepthGen.GetMetaData( mDepthMD );
    unsigned int uPointNum = mDepthMD.FullXRes() * mDepthMD.FullYRes();

    // build the data structure for convert
    XnPoint3D* pDepthPointSet = new XnPoint3D[ uPointNum ];
    unsigned int i, j, idxShift, idx;
    for( j = 0; j < mDepthMD.FullYRes(); ++j )
    {
        idxShift = j * mDepthMD.FullXRes();
        for( i = 0; i < mDepthMD.FullXRes(); ++i )
        {
            idx = idxShift + i;
            pDepthPointSet[idx].X = i;
            pDepthPointSet[idx].Y = j;
            pDepthPointSet[idx].Z = pDepth[idx];
        }
    }

    // un-project points to real world
    XnPoint3D* p3DPointSet = new XnPoint3D[ uPointNum ];
    rDepthGen.ConvertProjectiveToRealWorld( uPointNum, pDepthPointSet, p3DPointSet );
    delete[] pDepthPointSet;

    // build point cloud
    for( i = 0; i < uPointNum; ++ i )
    {
        // skip the depth 0 points
        if( p3DPointSet[i].Z == 0 )
            continue;

        vPointCloud.push_back( SColorPoint3D( p3DPointSet[i], pImage[i] ) );
    }
    delete[] p3DPointSet;
}
 
int main(void)
{
    XnStatus eResult = XN_STATUS_OK;
    int i = 0;
  
    // init
    Context mContext;
    eResult = mContext.Init();  

    DepthGenerator mDepthGenerator;
    eResult = mDepthGenerator.Create(mContext);
    ImageGenerator mImageGenerator;
    eResult = mImageGenerator.Create(mContext);

    // set output mode
    XnMapOutputMode mapMode;
    mapMode.nXRes = XN_VGA_X_RES;
    mapMode.nYRes = XN_VGA_Y_RES;
    mapMode.nFPS  = 30;
    eResult = mDepthGenerator.SetMapOutputMode(mapMode);
    eResult = mImageGenerator.SetMapOutputMode(mapMode);

    // start generating  
    eResult = mContext.StartGeneratingAll();  

    // read data
    vector<SColorPoint3D> vPointCloud;
    while ( !xnOSWasKeyboardHit() )
    {
        eResult = mContext.WaitNoneUpdateAll();
        // get the depth map
        const XnDepthPixel*  pDepthMap = mDepthGenerator.GetDepthMap();

        // get the image map
        const XnRGB24Pixel*  pImageMap = mImageGenerator.GetRGB24ImageMap();

        // generate point cloud
        vPointCloud.clear();
        GeneratePointCloud(mDepthGenerator, pDepthMap, pImageMap, vPointCloud );

        // print point cloud
        cout.flags(ios::left);    //Left-aligned
        cout << "Point number: " << vPointCloud.size() << endl;
        for(i=0;i<vPointCloud.size();i++)
        {
            cout << setw(10) << i;
            cout << "X:" << setw(10) << vPointCloud[i].X;
            cout << "Y:" << setw(10) << vPointCloud[i].Y; 
            cout << "Z:" << setw(10) << vPointCloud[i].Z; 
            cout << "R:" << setw(10) << vPointCloud[i].R; 
            cout << "G:" << setw(10) << vPointCloud[i].G; 
            cout << "B:" << setw(10) << vPointCloud[i].B <<endl; 
        }
    }

    //stop
    mContext.StopGeneratingAll();  
    mContext.Shutdown();  

    return 0;
}

            更新版:

#include <XnCppWrapper.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <unistd.h>
#include <GL/glut.h>
#include <math.h>

using namespace xn; 
using namespace std; 

/* 点云数据格式 */
struct point_xyz
{
    float  X;
    float  Y;
    float  Z;
    float  R;
    float  G;
    float  B;

    point_xyz(XnPoint3D pos, XnRGB24Pixel color)
    {
        X = pos.X;
        Y = pos.Y;
        Z = pos.Z;
        R = (float)color.nRed / 255;
        G = (float)color.nGreen / 255;
        B = (float)color.nBlue / 255;
    }
};

/* 点云类 */
class point_cloud
{
private:
    Context            &context;
    DepthGenerator     &depth_generator;
    ImageGenerator     &image_generator;
    XnStatus           result_val;
    XnMapOutputMode    map_mode;

public:
    vector<point_xyz>  cloud_vector;        //存放一帧图像中的所有点云数据

    /* 构造函数\析构函数 */
    point_cloud(Context &contex, DepthGenerator &depthGenerator, ImageGenerator &imageGenerator)  
                : context(contex), depth_generator(depthGenerator), 
                  image_generator(imageGenerator), result_val(XN_STATUS_OK) {}
    ~point_cloud() { stop(); }  
        
    /* 输出模式设置 */
    inline const XnMapOutputMode get_default_output_mode();
    void set_output_mode(const XnMapOutputMode &outputMode);

    /* 点云数据处理*/
    void        init();
    void        stop();
    void        updata();
    inline void clear();
    inline void print();
    inline int  size();

    /* 错误输出 */
    inline void printError();
};

inline const XnMapOutputMode point_cloud::get_default_output_mode()  
{   
    XnMapOutputMode outputMode = {XN_VGA_X_RES, XN_VGA_Y_RES, 30};  
    return outputMode;  
}  

void point_cloud::set_output_mode(const XnMapOutputMode &outputMode)
{
    map_mode.nFPS  = outputMode.nFPS;  
    map_mode.nXRes = outputMode.nXRes;  
    map_mode.nYRes = outputMode.nYRes;  
}

void point_cloud::init()
{  
    result_val = context.Init();  
    printError();  

    /* 从文件中获取数据 */
    result_val = context.OpenFileRecording("tempRec.oni");
    printError();
    result_val = context.FindExistingNode(XN_NODE_TYPE_DEPTH, depth_generator);
    printError();
    result_val = context.FindExistingNode(XN_NODE_TYPE_IMAGE, image_generator);
    printError();
    
    /* 从设备中获取数据 */
    /*result_val = depth_generator.Create(context);
    printError();
    result_val = image_generator.Create(context);
    printError();
    // set output mode
    result_val = depth_generator.SetMapOutputMode(map_mode);
    printError(); 
    result_val = image_generator.SetMapOutputMode(map_mode);
    printError(); */
    
    /* 开始生成数据 */  
    result_val = context.StartGeneratingAll();  
    printError();
}  

void point_cloud::stop()
{
    context.StopGeneratingAll();  
    context.Shutdown(); 
}

inline void point_cloud::print()
{
    int i;
    cout.flags(ios::left);    //Left-aligned
    cout << "Point number: " << size() << endl;
    for(i=0;i< size();i++)
    {
        cout << "X:" << setw(10) << cloud_vector[i].X;
        cout << "Y:" << setw(10) << cloud_vector[i].Y; 
        cout << "Z:" << setw(10) << cloud_vector[i].Z; 
        cout << "R:" << setw(10) << cloud_vector[i].R; 
        cout << "G:" << setw(10) << cloud_vector[i].G; 
        cout << "B:" << setw(10) << cloud_vector[i].B <<endl; 
    }
}

inline int point_cloud::size()
{
    return cloud_vector.size();
}

inline void point_cloud::clear()
{
    cloud_vector.clear();
}

inline void point_cloud::printError()  
{  
    if (result_val != XN_STATUS_OK)
    {  
        printf("Error: %s", xnGetStatusString(result_val));  
        exit(-1);  
    }  
} 

void point_cloud::updata()
{
    result_val = context.WaitNoneUpdateAll();
    /* 获得深度和图像数据 */
    const XnDepthPixel*  pDepth = depth_generator.GetDepthMap();
    const XnRGB24Pixel*  pImage = image_generator.GetRGB24ImageMap();

    /* 清零点云向量 */
    clear();  

    /* 获得点的数量 */
    DepthMetaData   mDepthMD;
    depth_generator.GetMetaData(mDepthMD);
    unsigned int uPointNum = mDepthMD.FullXRes() * mDepthMD.FullYRes();

    /* 获得原始的点云数据 */
    XnPoint3D* pDepthPointSet = new XnPoint3D[uPointNum];
    unsigned int i, j, idxShift, idx;
    for( j = 0; j < mDepthMD.FullYRes(); ++j )
    {
        idxShift = j * mDepthMD.FullXRes();
        for( i = 0; i < mDepthMD.FullXRes(); ++i )
        {
            idx = idxShift + i;
            pDepthPointSet[idx].X = i;
            pDepthPointSet[idx].Y = j;
            pDepthPointSet[idx].Z = pDepth[idx];
        }
    }

    /* 将原始数据转换成真实的3D数据 */
    XnPoint3D* p3DPointSet = new XnPoint3D[uPointNum];
    depth_generator.ConvertProjectiveToRealWorld(uPointNum, pDepthPointSet, p3DPointSet);
    delete[] pDepthPointSet;

    /* 输出点云数据 */
    for( i = 0; i < uPointNum; ++ i )
    {
        if( p3DPointSet[i].Z == 0 )    // 跳过深度为0的数据
            continue;

        cloud_vector.push_back( point_xyz( p3DPointSet[i], pImage[i] ) );
    }
    delete[] p3DPointSet;
}


  • 3
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
### 回答1: Azure Kinect是一款由微软推出的先进计算机视觉和人机交互设备,它集成了高分辨率RGB相机、深度传感器和麦克风阵列。Azure Kinect的核心技术是通过深度传感器和相机捕捉现实世界的深度和图像信息,以生成点云数据点云是由大量三维点组成的数据集,每个点都具有坐标、颜色和其他属性。Azure Kinect通过其深度传感器捕捉物体的几何形状和纹理信息,并通过RGB相机捕捉物体的颜色信息。然后,将这些信息结合起来,生成一个包含三维点的点云。 利用Azure Kinect点云数据,可以进行各种计算机视觉和图像处理任务。例如,可以利用点云数据进行物体识别、姿态识别、场景重建等。通过分析和处理点云数据,可以提取出对象的形状、表面转移、位置等信息。 Azure Kinect点云功能广泛应用于虚拟现实、增强现实、人机交互、机器人导航和自动驾驶等领域。在虚拟现实中,可以利用点云数据重建出真实世界的场景,提供更逼真的虚拟体验。在人机交互中,可以通过识别人体姿态、识别手势等,实现更自然、智能的人机交互。在自动驾驶中,可以通过点云数据识别和检测交通障碍物,以实现智能化的导航。 总之,Azure Kinect通过其强大的点云功能,为计算机视觉和图像处理提供了优秀的工具和平台,为各种应用场景提供了更加精确和准确的数据支持。 ### 回答2: Azure Kinect是由微软公司开发的一种深度摄像头,它运用了先进的计算机视觉技术,可以实时捕捉和跟踪人体和环境的动作、姿势和形态。Azure Kinect还提供了点云功能,可以将捕捉到的三维信息转化为点云数据,并通过编程进行处理和分析。 点云是一种用于描述物体表面几何形状的表示方法,它由一系列的点坐标构成。通过Azure Kinect捕捉到的深度图像可以转化为点云数据,从而更详细地描述环境和物体的形状。点云数据可以用于虚拟现实、增强现实、机器人导航、三维重建等领域。 利用Azure Kinect点云功能,可以进行各种有趣的应用。例如,可以通过点云数据生成高精度的三维模型,从而实现真实感十足的虚拟现实体验。另外,点云数据还可以用于人体姿势识别和动作捕捉,可以应用于体育培训、运动分析等领域。 在机器人导航方面,点云数据可以用于建立环境地图,并进行感知和避障。通过分析点云数据,机器人可以检测到障碍物的位置和形状,从而进行路径规划和避障。此外,通过点云数据还可以实现三维重建,将真实世界复制到虚拟环境中,并进行各种分析和展示。 总而言之,Azure Kinect点云功能可以将捕捉到的三维信息转化为有用的点云数据,并通过编程进行处理和分析。它为虚拟现实、增强现实、机器人导航、三维重建等领域的应用提供了强大的支持。 ### 回答3: Azure Kinect是由微软开发的一种深度学习感知设备,它集成了深度摄像机和语音识别技术,具有强大的计算能力和高精度的感知能力。它可以通过捕捉实时的三维点云数据来检测和识别物体、人脸、动作等,可应用于多种场景,如虚拟现实、增强现实、人脸识别、人体姿势分析等。 点云是由多个三维点组成的数据集合,每个点包含位置和颜色信息。Azure Kinect可以通过深度摄像机获取场景中的点云数据,然后通过处理算法进行分析和处理。点云数据可以用于创建三维模型、重建实际场景、测量物体形状和尺寸等。 使用Azure Kinect进行点云分析可以帮助我们更好地理解和识别场景中的物体和人体动作。通过对点云数据进行处理和分析,可以实现物体的实时检测、跟踪和识别,进而应用于安防监控、人机交互、机器人导航等领域。 而且,点云数据还可以用于三维重建和建模。通过对点云进行处理和优化,可以生成高精度的三维模型和场景重建结果。这对于虚拟现实、增强现实等应用具有重要的意义,可以提供更真实、沉浸式的用户体验。 综上所述,Azure Kinect点云分析是一种强大的感知技术和数据处理方法。它们可以应用于多个领域,提供更精确、全面的场景理解和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值