/*===================================================================== QGroundControl Open Source Ground Control Station (c) 2009, 2010 QGROUNDCONTROL PROJECT This file is part of the QGROUNDCONTROL project QGROUNDCONTROL is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. QGROUNDCONTROL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QGROUNDCONTROL. If not, see . ======================================================================*/ /** * @file * @brief Definition of the class Freenect. * * @author Lionel Heng * */ #ifndef FREENECT_H #define FREENECT_H #include #include #include #include #include #include #include #include #include class Freenect { public: Freenect(); ~Freenect(); bool init(int userDeviceNumber = 0); bool process(void); QSharedPointer getRgbData(void); QSharedPointer getRawDepthData(void); QSharedPointer getColoredDepthData(void); QSharedPointer< QVector > get3DPointCloudData(void); typedef struct { double x; double y; double z; unsigned char r; unsigned char g; unsigned char b; } Vector6D; QSharedPointer< QVector > get6DPointCloudData(); int getTiltAngle(void) const; void setTiltAngle(int angle); private: typedef struct { // coordinates of principal point double cx; double cy; // focal length in pixels double fx; double fy; // distortion parameters double k[5]; } IntrinsicCameraParameters; void readConfigFile(void); void rectifyPoint(const QVector2D& originalPoint, QVector2D& rectifiedPoint, const IntrinsicCameraParameters& params); void unrectifyPoint(const QVector2D& rectifiedPoint, QVector2D& originalPoint, const IntrinsicCameraParameters& params); void projectPixelTo3DRay(const QVector2D& pixel, QVector3D& ray, const IntrinsicCameraParameters& params); static void videoCallback(freenect_device* device, void* video, uint32_t timestamp); static void depthCallback(freenect_device* device, void* depth, uint32_t timestamp); freenect_context* context; freenect_device* device; class FreenectThread : public QThread { public: explicit FreenectThread(freenect_device* _device); protected: virtual void run(void); freenect_device* device; }; QScopedPointer thread; IntrinsicCameraParameters rgbCameraParameters; IntrinsicCameraParameters depthCameraParameters; QMatrix4x4 transformMatrix; double baseline; double disparityOffset; // tilt angle of Kinect camera int tiltAngle; // rgbd data char rgb[FREENECT_VIDEO_RGB_SIZE]; QMutex rgbMutex; char depth[FREENECT_DEPTH_11BIT_SIZE]; QMutex depthMutex; char coloredDepth[FREENECT_VIDEO_RGB_SIZE]; QMutex coloredDepthMutex; // accelerometer data double ax, ay, az; double dx, dy, dz; // gamma map unsigned short gammaTable[2048]; QVector3D depthProjectionMatrix[FREENECT_FRAME_PIX]; QVector2D rgbRectificationMap[FREENECT_FRAME_PIX]; // variables for use outside class QSharedPointer rgbData; QSharedPointer rawDepthData; QSharedPointer coloredDepthData; QSharedPointer< QVector > pointCloud3D; QSharedPointer< QVector > pointCloud6D; }; #endif // FREENECT_H