OpenNI2——初尝试之 环境搭建 与 读取VideoMode

来源:互联网 发布:python exit 1 编辑:程序博客网 时间:2024/06/06 07:00

环境配置


        由于官网关闭,没有找到OpenNI2 SDK官方下载地址,下面的链接提供了各个平台下OpenNI2的下载。注意安装的版本最重要的不是要和平台对应,例如x64系统安装x64 SDK,而是要和所编写的程序对应。我刚开始安装了x64 SDK,建立工程后总是出现链接错误,检查了好久才发现工程是32位的,而添加的库文件是64位的。

        

        OpenNI2 SDK下载链接

        

        建立工程时的环境的配置可以参考OpenCV的配置。


读取VideoMode

        

        OpenNI2 文档中提到,在使用setVideoMode()设置数据流格式时(如分辨率、帧率),推荐是用getSupportVidoModes()函数读取硬件所支持的格式组合:
        Changes the current video mode of this stream. Recommended practice is to use Device::getSensorInfo(), and then SensorInfo::getSupportedVideoModes() to obtain a list of valid video mode settings for this stream. Then, pass a valid VideoMode to setVideoMode to ensure correct operation.


查看源码可以发现,getSupportVidoModes()返回Array<VideoMode>类型对象的引用,而Array<T>并没有实现拷贝构造函数,而且还对其进行了"隐藏":

template<class T>class Array{public:       Array() : m_data(NULL), m_count(0), m_owner(false) {}         Array(const T* data, int count) : m_owner(false) { _setData(data, count); }         ~Array()      {           clear();       }           int getSize() const { return m_count; }            const T& operator[](int index) const {return m_data[index];}        void _setData(const T* data, int count, bool isOwner = false)    {                   clear();               m_count = count;               m_owner = isOwner;                 if (!isOwner)              {                 m_data = data;         }               else           {                    m_data = new T[count];                 memcpy((void*)m_data, data, count*sizeof(T));          }        }     private:      Array(const Array<T>&);     Array<T>& operator=(const Array<T>&);            void clear()          {                if (m_owner && m_data != NULL)            delete []m_data;               m_owner = false;             m_data = NULL;              m_count = 0;    }              const T* m_data;        int m_count;         bool m_owner;  };

可能是为了方便移植,OpenNI自己实现Array<T>而不是使用STL的容器。要接收getSupportVidoModes()返回的值,有两种方法,一是实现Array<T>的拷贝构造函数,然后重新编译OpenNI.lib;二是使用Array<T>的成员函数_setData()。使用_setData()的方法如下:

    Status rc = OpenNI::initialize();    if (rc != STATUS_OK)    {        printf("Initialize failed\n%s\n", OpenNI::getExtendedError());        return -1;    }    Device device;    rc = device.open(ANY_DEVICE);    if (rc != STATUS_OK)    {        printf("Couldn't open device\n%s\n", OpenNI::getExtendedError());        return -1;    }    VideoStream depth;    if (device.getSensorInfo(SENSOR_DEPTH) != NULL)    {        rc = depth.create(device, SENSOR_DEPTH);        if (rc != STATUS_OK)        {            printf("Couldn't create depth stream\n%s\n", OpenNI::getExtendedError());            return -1;        }        }    const SensorInfo& sensorInfo = depth.getSensorInfo();    Array<VideoMode> modes;        modes._setData(&(sensorInfo.getSupportedVideoModes())[0],sensorInfo.getSupportedVideoModes().getSize(),true);
连接Kinect XBOX360时,打印的结果为: 



0 0