mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-09 03:27:45 +08:00
Camera refactoring (#315)
* Camera Refactoring part 1 (Mac OS X) * fixed camera*** -> Camera*** * Fixed build for cameras Zed/RealSense/RealSense2 * increased version to 0.17.7 * fixed build for cameras K4W2 and FlyCapture2
This commit is contained in:
@@ -27,483 +27,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rtabmap/core/RtabmapExp.h" // DLL export/import defines
|
||||
#include <rtabmap/core/camera/CameraFreenect.h>
|
||||
#include <rtabmap/core/camera/CameraFreenect2.h>
|
||||
#include <rtabmap/core/camera/CameraK4W2.h>
|
||||
#include <rtabmap/core/camera/CameraOpenni.h>
|
||||
#include <rtabmap/core/camera/CameraOpenNI2.h>
|
||||
#include <rtabmap/core/camera/CameraOpenNICV.h>
|
||||
#include <rtabmap/core/camera/CameraRealSense.h>
|
||||
#include <rtabmap/core/camera/CameraRealSense2.h>
|
||||
#include <rtabmap/core/camera/CameraRGBDImages.h>
|
||||
|
||||
#include "rtabmap/utilite/UMutex.h"
|
||||
#include "rtabmap/utilite/USemaphore.h"
|
||||
#include "rtabmap/core/CameraModel.h"
|
||||
#include "rtabmap/core/Camera.h"
|
||||
#include "rtabmap/core/CameraRGB.h"
|
||||
#include "rtabmap/core/Version.h"
|
||||
|
||||
#include <pcl/pcl_config.h>
|
||||
|
||||
#ifdef HAVE_OPENNI
|
||||
#if __linux__ && __i386__ && __cplusplus >= 201103L
|
||||
#warning "Openni driver is not available on i386 when building with c++11 support"
|
||||
#else
|
||||
#define RTABMAP_OPENNI
|
||||
#include <pcl/io/openni_camera/openni_depth_image.h>
|
||||
#include <pcl/io/openni_camera/openni_image.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <boost/signals2/connection.hpp>
|
||||
|
||||
namespace openni
|
||||
{
|
||||
class Device;
|
||||
class VideoStream;
|
||||
}
|
||||
|
||||
namespace pcl
|
||||
{
|
||||
class Grabber;
|
||||
}
|
||||
|
||||
namespace libfreenect2
|
||||
{
|
||||
class Freenect2;
|
||||
class Freenect2Device;
|
||||
class SyncMultiFrameListener;
|
||||
class Registration;
|
||||
class PacketPipeline;
|
||||
}
|
||||
|
||||
namespace rs
|
||||
{
|
||||
class context;
|
||||
class device;
|
||||
namespace slam {
|
||||
class slam;
|
||||
}
|
||||
}
|
||||
|
||||
namespace rs2
|
||||
{
|
||||
class context;
|
||||
class device;
|
||||
class syncer;
|
||||
}
|
||||
struct rs2_intrinsics;
|
||||
struct rs2_extrinsics;
|
||||
|
||||
typedef struct _freenect_context freenect_context;
|
||||
typedef struct _freenect_device freenect_device;
|
||||
|
||||
typedef struct IKinectSensor IKinectSensor;
|
||||
typedef struct ICoordinateMapper ICoordinateMapper;
|
||||
typedef struct _DepthSpacePoint DepthSpacePoint;
|
||||
typedef struct _ColorSpacePoint ColorSpacePoint;
|
||||
typedef struct tagRGBQUAD RGBQUAD;
|
||||
typedef struct IMultiSourceFrameReader IMultiSourceFrameReader;
|
||||
|
||||
namespace rtabmap
|
||||
{
|
||||
|
||||
/////////////////////////
|
||||
// CameraOpenNIPCL
|
||||
/////////////////////////
|
||||
class RTABMAP_EXP CameraOpenni :
|
||||
public Camera
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
|
||||
public:
|
||||
// default local transform z in, x right, y down));
|
||||
CameraOpenni(const std::string & deviceId="",
|
||||
float imageRate = 0,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraOpenni();
|
||||
#ifdef RTABMAP_OPENNI
|
||||
void image_cb (
|
||||
const boost::shared_ptr<openni_wrapper::Image>& rgb,
|
||||
const boost::shared_ptr<openni_wrapper::DepthImage>& depth,
|
||||
float constant);
|
||||
#endif
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
pcl::Grabber* interface_;
|
||||
std::string deviceId_;
|
||||
boost::signals2::connection connection_;
|
||||
cv::Mat depth_;
|
||||
cv::Mat rgb_;
|
||||
float depthConstant_;
|
||||
UMutex dataMutex_;
|
||||
USemaphore dataReady_;
|
||||
};
|
||||
|
||||
/////////////////////////
|
||||
// CameraOpenNICV
|
||||
/////////////////////////
|
||||
class RTABMAP_EXP CameraOpenNICV :
|
||||
public Camera
|
||||
{
|
||||
|
||||
public:
|
||||
static bool available();
|
||||
|
||||
public:
|
||||
CameraOpenNICV(bool asus = false,
|
||||
float imageRate = 0,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraOpenNICV();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const {return "";} // unknown with OpenCV
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
bool _asus;
|
||||
cv::VideoCapture _capture;
|
||||
float _depthFocal;
|
||||
};
|
||||
|
||||
/////////////////////////
|
||||
// CameraOpenNI2
|
||||
/////////////////////////
|
||||
class RTABMAP_EXP CameraOpenNI2 :
|
||||
public Camera
|
||||
{
|
||||
|
||||
public:
|
||||
static bool available();
|
||||
static bool exposureGainAvailable();
|
||||
enum Type {kTypeColorDepth, kTypeIRDepth, kTypeIR};
|
||||
|
||||
public:
|
||||
CameraOpenNI2(const std::string & deviceId = "",
|
||||
Type type = kTypeColorDepth,
|
||||
float imageRate = 0,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraOpenNI2();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
bool setAutoWhiteBalance(bool enabled);
|
||||
bool setAutoExposure(bool enabled);
|
||||
bool setExposure(int value);
|
||||
bool setGain(int value);
|
||||
bool setMirroring(bool enabled);
|
||||
void setOpenNI2StampsAndIDsUsed(bool used);
|
||||
void setIRDepthShift(int horizontal, int vertical);
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
#ifdef RTABMAP_OPENNI2
|
||||
Type _type;
|
||||
openni::Device * _device;
|
||||
openni::VideoStream * _color;
|
||||
openni::VideoStream * _depth;
|
||||
float _depthFx;
|
||||
float _depthFy;
|
||||
std::string _deviceId;
|
||||
bool _openNI2StampsAndIDsUsed;
|
||||
StereoCameraModel _stereoModel;
|
||||
int _depthHShift;
|
||||
int _depthVShift;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/////////////////////////
|
||||
// CameraFreenect
|
||||
/////////////////////////
|
||||
class FreenectDevice;
|
||||
|
||||
class RTABMAP_EXP CameraFreenect :
|
||||
public Camera
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
enum Type {kTypeColorDepth, kTypeIRDepth};
|
||||
|
||||
public:
|
||||
// default local transform z in, x right, y down));
|
||||
CameraFreenect(int deviceId= 0,
|
||||
Type type = kTypeColorDepth,
|
||||
float imageRate=0.0f,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraFreenect();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
#ifdef RTABMAP_FREENECT
|
||||
int deviceId_;
|
||||
Type type_;
|
||||
freenect_context * ctx_;
|
||||
FreenectDevice * freenectDevice_;
|
||||
StereoCameraModel stereoModel_;
|
||||
#endif
|
||||
};
|
||||
|
||||
/////////////////////////
|
||||
// CameraFreenect2
|
||||
/////////////////////////
|
||||
|
||||
class RTABMAP_EXP CameraFreenect2 :
|
||||
public Camera
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
|
||||
enum Type{
|
||||
kTypeColor2DepthSD,
|
||||
kTypeDepth2ColorSD,
|
||||
kTypeDepth2ColorHD,
|
||||
kTypeDepth2ColorHD2,
|
||||
kTypeIRDepth,
|
||||
kTypeColorIR
|
||||
};
|
||||
|
||||
public:
|
||||
// default local transform z in, x right, y down));
|
||||
CameraFreenect2(int deviceId= 0,
|
||||
Type type = kTypeDepth2ColorSD,
|
||||
float imageRate=0.0f,
|
||||
const Transform & localTransform = Transform::getIdentity(),
|
||||
float minDepth = 0.3f,
|
||||
float maxDepth = 12.0f,
|
||||
bool bilateralFiltering = true,
|
||||
bool edgeAwareFiltering = true,
|
||||
bool noiseFiltering = true,
|
||||
const std::string & pipelineName = "");
|
||||
virtual ~CameraFreenect2();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
#ifdef RTABMAP_FREENECT2
|
||||
int deviceId_;
|
||||
Type type_;
|
||||
StereoCameraModel stereoModel_;
|
||||
libfreenect2::Freenect2 * freenect2_;
|
||||
libfreenect2::Freenect2Device *dev_;
|
||||
libfreenect2::SyncMultiFrameListener * listener_;
|
||||
libfreenect2::Registration * reg_;
|
||||
float minKinect2Depth_;
|
||||
float maxKinect2Depth_;
|
||||
bool bilateralFiltering_;
|
||||
bool edgeAwareFiltering_;
|
||||
bool noiseFiltering_;
|
||||
std::string pipelineName_;
|
||||
#endif
|
||||
};
|
||||
|
||||
/////////////////////////
|
||||
// CameraK4W2
|
||||
/////////////////////////
|
||||
|
||||
class RTABMAP_EXP CameraK4W2 :
|
||||
public Camera
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
|
||||
enum Type {
|
||||
kTypeColor2DepthSD,
|
||||
kTypeDepth2ColorSD,
|
||||
kTypeDepth2ColorHD
|
||||
};
|
||||
|
||||
public:
|
||||
static const int cDepthWidth = 512;
|
||||
static const int cDepthHeight = 424;
|
||||
static const int cColorWidth = 1920;
|
||||
static const int cColorHeight = 1080;
|
||||
|
||||
public:
|
||||
// default local transform z in, x right, y down));
|
||||
CameraK4W2(int deviceId = 0, // not used
|
||||
Type type = kTypeDepth2ColorSD,
|
||||
float imageRate = 0.0f,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraK4W2();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
void close();
|
||||
|
||||
private:
|
||||
#ifdef RTABMAP_K4W2
|
||||
Type type_;
|
||||
IKinectSensor* pKinectSensor_;
|
||||
ICoordinateMapper* pCoordinateMapper_;
|
||||
DepthSpacePoint* pDepthCoordinates_;
|
||||
ColorSpacePoint* pColorCoordinates_;
|
||||
IMultiSourceFrameReader* pMultiSourceFrameReader_;
|
||||
RGBQUAD * pColorRGBX_;
|
||||
INT_PTR hMSEvent;
|
||||
CameraModel colorCameraModel_;
|
||||
#endif
|
||||
};
|
||||
|
||||
/////////////////////////
|
||||
// CameraRealSense
|
||||
/////////////////////////
|
||||
class slam_event_handler;
|
||||
class RTABMAP_EXP CameraRealSense :
|
||||
public Camera
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
enum RGBSource {kColor, kInfrared, kFishEye};
|
||||
|
||||
public:
|
||||
// default local transform z in, x right, y down));
|
||||
CameraRealSense(
|
||||
int deviceId = 0,
|
||||
int presetRGB = 0, // 0=best quality, 1=largest image, 2=highest framerate
|
||||
int presetDepth = 0, // 0=best quality, 1=largest image, 2=highest framerate
|
||||
bool computeOdometry = false,
|
||||
float imageRate = 0,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraRealSense();
|
||||
|
||||
void setDepthScaledToRGBSize(bool enabled);
|
||||
void setRGBSource(RGBSource source);
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
virtual bool odomProvided() const;
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
#ifdef RTABMAP_REALSENSE
|
||||
rs::context * ctx_;
|
||||
rs::device * dev_;
|
||||
int deviceId_;
|
||||
int presetRGB_;
|
||||
int presetDepth_;
|
||||
bool computeOdometry_;
|
||||
bool depthScaledToRGBSize_;
|
||||
RGBSource rgbSource_;
|
||||
CameraModel cameraModel_;
|
||||
std::vector<int> rsRectificationTable_;
|
||||
|
||||
int motionSeq_[2];
|
||||
rs::slam::slam * slam_;
|
||||
UMutex slamLock_;
|
||||
|
||||
std::map<double, std::pair<cv::Mat, cv::Mat> > bufferedFrames_;
|
||||
std::pair<cv::Mat, cv::Mat> lastSyncFrames_;
|
||||
UMutex dataMutex_;
|
||||
USemaphore dataReady_;
|
||||
#endif
|
||||
};
|
||||
/////////////////////////
|
||||
// CameraRealSense2
|
||||
/////////////////////////
|
||||
class slam_event_handler;
|
||||
class RTABMAP_EXP CameraRealSense2 :
|
||||
public Camera
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
|
||||
public:
|
||||
// default local transform z in, x right, y down));
|
||||
CameraRealSense2(
|
||||
const std::string & deviceId = "",
|
||||
float imageRate = 0,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraRealSense2();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
// parameters are set during initialization
|
||||
void setEmitterEnabled(bool enabled);
|
||||
void setIRDepthFormat(bool enabled);
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
#ifdef RTABMAP_REALSENSE2
|
||||
rs2::context * ctx_;
|
||||
rs2::device * dev_;
|
||||
std::string deviceId_;
|
||||
rs2::syncer * syncer_;
|
||||
float depth_scale_meters_;
|
||||
rs2_intrinsics * depthIntrinsics_;
|
||||
rs2_intrinsics * rgbIntrinsics_;
|
||||
rs2_extrinsics * depthToRGBExtrinsics_;
|
||||
cv::Mat depthBuffer_;
|
||||
cv::Mat rgbBuffer_;
|
||||
CameraModel model_;
|
||||
|
||||
bool emitterEnabled_;
|
||||
bool irDepth_;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/////////////////////////
|
||||
// CameraRGBDImages
|
||||
/////////////////////////
|
||||
class CameraImages;
|
||||
class RTABMAP_EXP CameraRGBDImages :
|
||||
public CameraImages
|
||||
{
|
||||
public:
|
||||
static bool available();
|
||||
|
||||
public:
|
||||
CameraRGBDImages(
|
||||
const std::string & pathRGBImages,
|
||||
const std::string & pathDepthImages,
|
||||
float depthScaleFactor = 1.0f,
|
||||
float imageRate=0.0f,
|
||||
const Transform & localTransform = Transform::getIdentity());
|
||||
virtual ~CameraRGBDImages();
|
||||
|
||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||
virtual bool isCalibrated() const;
|
||||
virtual std::string getSerial() const;
|
||||
|
||||
virtual void setStartIndex(int index) {CameraImages::setStartIndex(index);cameraDepth_.setStartIndex(index);} // negative means last
|
||||
|
||||
protected:
|
||||
virtual SensorData captureImage(CameraInfo * info = 0);
|
||||
|
||||
private:
|
||||
CameraImages cameraDepth_;
|
||||
};
|
||||
|
||||
} // namespace rtabmap
|
||||
|
||||
Reference in New Issue
Block a user