mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-03 16:27:46 +08:00
0.11.7: Added ZED sdk support
This commit is contained in:
+46
-1
@@ -20,7 +20,7 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 11)
|
SET(RTABMAP_MINOR_VERSION 11)
|
||||||
SET(RTABMAP_PATCH_VERSION 6)
|
SET(RTABMAP_PATCH_VERSION 7)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
@@ -136,6 +136,7 @@ option(WITH_TORO "Include TORO support" ON)
|
|||||||
option(WITH_VERTIGO "Include Vertigo support" ON)
|
option(WITH_VERTIGO "Include Vertigo support" ON)
|
||||||
option(WITH_CVSBA "Include cvsba support" ON)
|
option(WITH_CVSBA "Include cvsba support" ON)
|
||||||
option(WITH_FLYCAPTURE2 "Include FlyCapture2/Triclops support" ON)
|
option(WITH_FLYCAPTURE2 "Include FlyCapture2/Triclops support" ON)
|
||||||
|
option(WITH_ZED "Include ZED sdk support" ON)
|
||||||
|
|
||||||
FIND_PACKAGE(OpenCV REQUIRED QUIET)
|
FIND_PACKAGE(OpenCV REQUIRED QUIET)
|
||||||
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET)
|
FIND_PACKAGE(PCL 1.7 REQUIRED QUIET)
|
||||||
@@ -265,6 +266,35 @@ IF(WITH_CVSBA)
|
|||||||
ENDIF(cvsba_FOUND)
|
ENDIF(cvsba_FOUND)
|
||||||
ENDIF(WITH_CVSBA)
|
ENDIF(WITH_CVSBA)
|
||||||
|
|
||||||
|
IF(WITH_ZED)
|
||||||
|
IF(WIN32) # Windows
|
||||||
|
SET(ZED_INCLUDE_DIRS $ENV{ZED_INCLUDE_DIRS})
|
||||||
|
if (CMAKE_CL_64) # 64 bits
|
||||||
|
SET(ZED_LIBRARIES $ENV{ZED_LIBRARIES_64})
|
||||||
|
else(CMAKE_CL_64) # 32 bits
|
||||||
|
message("32bits compilation is no more available with CUDA7.0")
|
||||||
|
endif(CMAKE_CL_64)
|
||||||
|
SET(ZED_LIBRARY_DIR $ENV{ZED_LIBRARY_DIR})
|
||||||
|
IF(ZED_LIBRARIES AND ZED_INCLUDE_DIRS)
|
||||||
|
SET(ZED_FOUND TRUE)
|
||||||
|
LINK_DIRECTORIES( ${LINK_DIRECTORIES} ${ZED_LIBRARY_DIR})
|
||||||
|
ENDIF(ZED_LIBRARIES AND ZED_INCLUDE_DIRS)
|
||||||
|
ELSE() # Linux
|
||||||
|
find_package(ZED 0.9)
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
MESSAGE(STATUS "Found ZED sdk: ${ZED_INCLUDE_DIRS}")
|
||||||
|
## look for CUDA
|
||||||
|
find_package(CUDA)
|
||||||
|
IF(CUDA_FOUND)
|
||||||
|
MESSAGE(STATUS "Found CUDA: ${CUDA_INCLUDE_DIRS}")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(FATAL_ERROR "CUDA is required to build with Zed sdk! Set -DWITH_ZED=OFF if you don't have CUDA.")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF(ZED_FOUND)
|
||||||
|
ENDIF(WITH_ZED)
|
||||||
|
|
||||||
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
|
####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
|
||||||
IF(APPLE AND BUILD_AS_BUNDLE)
|
IF(APPLE AND BUILD_AS_BUNDLE)
|
||||||
IF(Qt5_FOUND OR (QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND))
|
IF(Qt5_FOUND OR (QT4_FOUND AND QT_QTCORE_FOUND AND QT_QTGUI_FOUND))
|
||||||
@@ -327,6 +357,9 @@ ENDIF(NOT DC1394_FOUND)
|
|||||||
IF(NOT FlyCapture2_FOUND)
|
IF(NOT FlyCapture2_FOUND)
|
||||||
SET(FLYCAPTURE2 "//")
|
SET(FLYCAPTURE2 "//")
|
||||||
ENDIF(NOT FlyCapture2_FOUND)
|
ENDIF(NOT FlyCapture2_FOUND)
|
||||||
|
IF(NOT ZED_FOUND)
|
||||||
|
SET(ZED "//")
|
||||||
|
ENDIF(NOT ZED_FOUND)
|
||||||
IF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
IF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
||||||
SET(OPENCV3 "//")
|
SET(OPENCV3 "//")
|
||||||
ENDIF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
ENDIF(NOT (OpenCV_FOUND AND OpenCV_VERSION_MAJOR EQUAL 3))
|
||||||
@@ -601,6 +634,18 @@ ELSE()
|
|||||||
MESSAGE(STATUS " With cvsba = NO (cvsba not found)")
|
MESSAGE(STATUS " With cvsba = NO (cvsba not found)")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
IF(CUDA_FOUND)
|
||||||
|
MESSAGE(STATUS " With ZED = YES (With CUDA)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ZED = YES (Without CUDA)")
|
||||||
|
ENDIF()
|
||||||
|
ELSEIF(NOT WITH_ZED)
|
||||||
|
MESSAGE(STATUS " With ZED = NO (WITH_ZED=OFF)")
|
||||||
|
ELSE()
|
||||||
|
MESSAGE(STATUS " With ZED = NO (ZED sdk not found)")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(QT4_FOUND)
|
IF(QT4_FOUND)
|
||||||
MESSAGE(STATUS " With Qt4 = YES (License: Open Source or Commercial)")
|
MESSAGE(STATUS " With Qt4 = YES (License: Open Source or Commercial)")
|
||||||
ELSEIF(Qt5_FOUND)
|
ELSEIF(Qt5_FOUND)
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
@CVSBA@#define RTABMAP_CVSBA
|
@CVSBA@#define RTABMAP_CVSBA
|
||||||
@DC1394@#define RTABMAP_DC1394
|
@DC1394@#define RTABMAP_DC1394
|
||||||
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
@FLYCAPTURE2@#define RTABMAP_FLYCAPTURE2
|
||||||
|
@ZED@#define RTABMAP_ZED
|
||||||
|
|
||||||
#endif /* VERSION_H_ */
|
#endif /* VERSION_H_ */
|
||||||
|
|
||||||
|
|||||||
@@ -39,6 +39,14 @@ namespace FlyCapture2
|
|||||||
class Camera;
|
class Camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace sl
|
||||||
|
{
|
||||||
|
namespace zed
|
||||||
|
{
|
||||||
|
class Camera;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -94,6 +102,32 @@ private:
|
|||||||
void * triclopsCtx_; // TriclopsContext
|
void * triclopsCtx_; // TriclopsContext
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/////////////////////////
|
||||||
|
// CameraStereoZED
|
||||||
|
/////////////////////////
|
||||||
|
class RTABMAP_EXP CameraStereoZed :
|
||||||
|
public Camera
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool available();
|
||||||
|
|
||||||
|
public:
|
||||||
|
CameraStereoZed(bool rgbdMode, float imageRate=0.0f, const Transform & localTransform = Transform::getIdentity());
|
||||||
|
virtual ~CameraStereoZed();
|
||||||
|
|
||||||
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
|
virtual bool isCalibrated() const;
|
||||||
|
virtual std::string getSerial() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual SensorData captureImage();
|
||||||
|
|
||||||
|
private:
|
||||||
|
sl::zed::Camera * zed_;
|
||||||
|
StereoCameraModel stereoModel_;
|
||||||
|
bool rgbdMode_;
|
||||||
|
};
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
// CameraStereoImages
|
// CameraStereoImages
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
@@ -147,6 +181,10 @@ public:
|
|||||||
bool rectifyImages = false,
|
bool rectifyImages = false,
|
||||||
float imageRate=0.0f,
|
float imageRate=0.0f,
|
||||||
const Transform & localTransform = Transform::getIdentity());
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
|
CameraStereoVideo(
|
||||||
|
int device,
|
||||||
|
float imageRate = 0.0f,
|
||||||
|
const Transform & localTransform = Transform::getIdentity());
|
||||||
virtual ~CameraStereoVideo();
|
virtual ~CameraStereoVideo();
|
||||||
|
|
||||||
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
virtual bool init(const std::string & calibrationFolder = ".", const std::string & cameraName = "");
|
||||||
@@ -162,6 +200,8 @@ private:
|
|||||||
bool rectifyImages_;
|
bool rectifyImages_;
|
||||||
StereoCameraModel stereoModel_;
|
StereoCameraModel stereoModel_;
|
||||||
std::string cameraName_;
|
std::string cameraName_;
|
||||||
|
CameraVideo::Source src_;
|
||||||
|
int usbDevice_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace rtabmap
|
} // namespace rtabmap
|
||||||
|
|||||||
@@ -221,9 +221,9 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Kp, BadSignRatio, float, 0.5, "Bad signature ratio (less than Ratio x AverageWordsPerImage = bad).");
|
RTABMAP_PARAM(Kp, BadSignRatio, float, 0.5, "Bad signature ratio (less than Ratio x AverageWordsPerImage = bad).");
|
||||||
RTABMAP_PARAM(Kp, NndrRatio, float, 0.8, "NNDR ratio (A matching pair is detected, if its distance is closer than X times the distance of the second nearest neighbor.)");
|
RTABMAP_PARAM(Kp, NndrRatio, float, 0.8, "NNDR ratio (A matching pair is detected, if its distance is closer than X times the distance of the second nearest neighbor.)");
|
||||||
#ifdef RTABMAP_NONFREE
|
#ifdef RTABMAP_NONFREE
|
||||||
RTABMAP_PARAM(Kp, DetectorStrategy, int, 0, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK.");
|
RTABMAP_PARAM(Kp, DetectorStrategy, int, 0, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.");
|
||||||
#else
|
#else
|
||||||
RTABMAP_PARAM(Kp, DetectorStrategy, int, 2, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK.");
|
RTABMAP_PARAM(Kp, DetectorStrategy, int, 2, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.");
|
||||||
#endif
|
#endif
|
||||||
RTABMAP_PARAM(Kp, TfIdfLikelihoodUsed, bool, true, "Use of the td-idf strategy to compute the likelihood.");
|
RTABMAP_PARAM(Kp, TfIdfLikelihoodUsed, bool, true, "Use of the td-idf strategy to compute the likelihood.");
|
||||||
RTABMAP_PARAM(Kp, Parallelized, bool, true, "If the dictionary update and signature creation were parallelized.");
|
RTABMAP_PARAM(Kp, Parallelized, bool, true, "If the dictionary update and signature creation were parallelized.");
|
||||||
@@ -396,7 +396,17 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Vis, EpipolarGeometryVar, float, 0.02, "[Vis/EstimationType = 2] Epipolar geometry maximum variance to accept the transformation.");
|
RTABMAP_PARAM(Vis, EpipolarGeometryVar, float, 0.02, "[Vis/EstimationType = 2] Epipolar geometry maximum variance to accept the transformation.");
|
||||||
RTABMAP_PARAM(Vis, MinInliers, int, 20, "Minimum feature correspondences to compute/accept the transformation.");
|
RTABMAP_PARAM(Vis, MinInliers, int, 20, "Minimum feature correspondences to compute/accept the transformation.");
|
||||||
RTABMAP_PARAM(Vis, Iterations, int, 100, "Maximum iterations to compute the transform.");
|
RTABMAP_PARAM(Vis, Iterations, int, 100, "Maximum iterations to compute the transform.");
|
||||||
RTABMAP_PARAM(Vis, FeatureType, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK.");
|
#ifndef RTABMAP_NONFREE
|
||||||
|
#ifdef RTABMAP_OPENCV3
|
||||||
|
// OpenCV 3 without xFeatures2D module doesn't have BRIEF
|
||||||
|
RTABMAP_PARAM(Vis, FeatureType, int, 8, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.");
|
||||||
|
#else
|
||||||
|
RTABMAP_PARAM(Vis, FeatureType, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.");
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
RTABMAP_PARAM(Vis, FeatureType, int, 6, "0=SURF 1=SIFT 2=ORB 3=FAST/FREAK 4=FAST/BRIEF 5=GFTT/FREAK 6=GFTT/BRIEF 7=BRISK 8=GFTT/ORB.");
|
||||||
|
#endif
|
||||||
|
|
||||||
RTABMAP_PARAM(Vis, MaxFeatures, int, 1000, "0 no limits.");
|
RTABMAP_PARAM(Vis, MaxFeatures, int, 1000, "0 no limits.");
|
||||||
RTABMAP_PARAM(Vis, MaxDepth, float, 0.0, "Max depth of the features (0 means no limit).");
|
RTABMAP_PARAM(Vis, MaxDepth, float, 0.0, "Max depth of the features (0 means no limit).");
|
||||||
RTABMAP_PARAM(Vis, MinDepth, float, 0.0, "Min depth of the features (0 means no limit).");
|
RTABMAP_PARAM(Vis, MinDepth, float, 0.0, "Min depth of the features (0 means no limit).");
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
@@ -68,7 +69,7 @@ void RTABMAP_EXP calcOpticalFlowPyrLKStereo( cv::InputArray _prevImg, cv::InputA
|
|||||||
cv::Mat RTABMAP_EXP disparityFromStereoImages(
|
cv::Mat RTABMAP_EXP disparityFromStereoImages(
|
||||||
const cv::Mat & leftImage,
|
const cv::Mat & leftImage,
|
||||||
const cv::Mat & rightImage,
|
const cv::Mat & rightImage,
|
||||||
int type = CV_32FC1); // CV_32FC1 or CV_16SC1
|
const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
cv::Mat RTABMAP_EXP depthFromDisparity(const cv::Mat & disparity,
|
cv::Mat RTABMAP_EXP depthFromDisparity(const cv::Mat & disparity,
|
||||||
float fx, float baseline,
|
float fx, float baseline,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <pcl/TextureMesh.h>
|
#include <pcl/TextureMesh.h>
|
||||||
#include <rtabmap/core/Transform.h>
|
#include <rtabmap/core/Transform.h>
|
||||||
#include <rtabmap/core/SensorData.h>
|
#include <rtabmap/core/SensorData.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
#include <opencv2/core/core.hpp>
|
#include <opencv2/core/core.hpp>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <list>
|
#include <list>
|
||||||
@@ -116,14 +117,16 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudFromStereoImages(
|
|||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0,
|
||||||
|
const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
||||||
const SensorData & sensorData,
|
const SensorData & sensorData,
|
||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0,
|
||||||
|
const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an RGB cloud from the images contained in SensorData. If there is only one camera,
|
* Create an RGB cloud from the images contained in SensorData. If there is only one camera,
|
||||||
@@ -143,7 +146,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
int decimation = 1,
|
int decimation = 1,
|
||||||
float maxDepth = 0.0f,
|
float maxDepth = 0.0f,
|
||||||
float minDepth = 0.0f,
|
float minDepth = 0.0f,
|
||||||
std::vector<int> * validIndices = 0);
|
std::vector<int> * validIndices = 0,
|
||||||
|
const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ> RTABMAP_EXP laserScanFromDepthImage(
|
pcl::PointCloud<pcl::PointXYZ> RTABMAP_EXP laserScanFromDepthImage(
|
||||||
const cv::Mat & depthImage,
|
const cv::Mat & depthImage,
|
||||||
|
|||||||
@@ -209,6 +209,27 @@ IF(cvsba_FOUND)
|
|||||||
)
|
)
|
||||||
ENDIF(cvsba_FOUND)
|
ENDIF(cvsba_FOUND)
|
||||||
|
|
||||||
|
IF(ZED_FOUND)
|
||||||
|
SET(INCLUDE_DIRS
|
||||||
|
${INCLUDE_DIRS}
|
||||||
|
${ZED_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
SET(LIBRARIES
|
||||||
|
${LIBRARIES}
|
||||||
|
${ZED_LIBRARIES}
|
||||||
|
)
|
||||||
|
IF(CUDA_FOUND)
|
||||||
|
SET(INCLUDE_DIRS
|
||||||
|
${INCLUDE_DIRS}
|
||||||
|
${CUDA_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
SET(LIBRARIES
|
||||||
|
${LIBRARIES}
|
||||||
|
${CUDA_LIBRARIES}
|
||||||
|
)
|
||||||
|
ENDIF(CUDA_FOUND)
|
||||||
|
ENDIF(ZED_FOUND)
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
# Generate resources files
|
# Generate resources files
|
||||||
####################################
|
####################################
|
||||||
|
|||||||
@@ -722,7 +722,7 @@ CameraVideo::~CameraVideo()
|
|||||||
|
|
||||||
bool CameraVideo::init(const std::string & calibrationFolder, const std::string & cameraName)
|
bool CameraVideo::init(const std::string & calibrationFolder, const std::string & cameraName)
|
||||||
{
|
{
|
||||||
_guid.clear();
|
_guid = cameraName;
|
||||||
if(_capture.isOpened())
|
if(_capture.isOpened())
|
||||||
{
|
{
|
||||||
_capture.release();
|
_capture.release();
|
||||||
@@ -749,20 +749,23 @@ bool CameraVideo::init(const std::string & calibrationFolder, const std::string
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (_guid.empty())
|
||||||
{
|
{
|
||||||
unsigned int guid = (unsigned int)_capture.get(CV_CAP_PROP_GUID);
|
unsigned int guid = (unsigned int)_capture.get(CV_CAP_PROP_GUID);
|
||||||
if (guid != 0 && guid != 0xffffffff)
|
if (guid != 0 && guid != 0xffffffff)
|
||||||
{
|
{
|
||||||
_guid = uFormat("%08x", guid);
|
_guid = uFormat("%08x", guid);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// look for calibration files
|
// look for calibration files
|
||||||
if(!calibrationFolder.empty() && (!_guid.empty() || !cameraName.empty()))
|
if(!calibrationFolder.empty() && !_guid.empty())
|
||||||
{
|
{
|
||||||
if(!_model.load(calibrationFolder, (cameraName.empty()?_guid:cameraName)))
|
if(!_model.load(calibrationFolder, _guid))
|
||||||
{
|
{
|
||||||
UWARN("Missing calibration files for camera \"%s\" in \"%s\" folder, you should calibrate the camera!",
|
UWARN("Missing calibration files for camera \"%s\" in \"%s\" folder, you should calibrate the camera!",
|
||||||
cameraName.empty()?_guid.c_str():cameraName.c_str(), calibrationFolder.c_str());
|
_guid.c_str(), calibrationFolder.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <fc2triclops.h>
|
#include <fc2triclops.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
#include <zed/Camera.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace rtabmap
|
namespace rtabmap
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -731,6 +735,152 @@ SensorData CameraStereoFlyCapture2::captureImage()
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// CameraStereoZED
|
||||||
|
//
|
||||||
|
bool CameraStereoZed::available()
|
||||||
|
{
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraStereoZed::CameraStereoZed(bool rgbdMode, float imageRate, const Transform & localTransform) :
|
||||||
|
Camera(imageRate, localTransform),
|
||||||
|
zed_(0),
|
||||||
|
rgbdMode_(rgbdMode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraStereoZed::~CameraStereoZed()
|
||||||
|
{
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
if(zed_)
|
||||||
|
{
|
||||||
|
delete zed_;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CameraStereoZed::init(const std::string & calibrationFolder, const std::string & cameraName)
|
||||||
|
{
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
if(zed_)
|
||||||
|
{
|
||||||
|
delete zed_;
|
||||||
|
zed_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(zed_->isZEDconnected())
|
||||||
|
{
|
||||||
|
zed_ = new sl::zed::Camera(sl::zed::HD720); // Use in Live Mode
|
||||||
|
//zed_ = new sl::zed::Camera(argv[1]); // Use in SVO playback mode
|
||||||
|
|
||||||
|
int width = zed_->getImageSize().width;
|
||||||
|
int height = zed_->getImageSize().height;
|
||||||
|
|
||||||
|
//init WITH self-calibration (- last parameter to false -)
|
||||||
|
sl::zed::ERRCODE err = zed_->init(sl::zed::MODE::PERFORMANCE, 0, true, false, false);
|
||||||
|
|
||||||
|
// Quit if an error occurred
|
||||||
|
if (err != sl::zed::SUCCESS)
|
||||||
|
{
|
||||||
|
UERROR("ZED camera initialization failed: %s", sl::zed::errcode2str(err));
|
||||||
|
delete zed_;
|
||||||
|
zed_ = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("ZED camera initialization failed: ZED is not connected!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
sl::zed::StereoParameters * stereoParams = zed_->getParameters();
|
||||||
|
sl::zed::resolution res = zed_->getImageSize();
|
||||||
|
|
||||||
|
stereoModel_ = StereoCameraModel(
|
||||||
|
stereoParams->LeftCam.fx,
|
||||||
|
stereoParams->LeftCam.fy,
|
||||||
|
stereoParams->LeftCam.cx,
|
||||||
|
stereoParams->LeftCam.cy,
|
||||||
|
stereoParams->baseline/1000.0f,
|
||||||
|
this->getLocalTransform(),
|
||||||
|
cv::Size(res.width, res.height));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
UERROR("CameraStereoZED: RTAB-Map is not built with ZED sdk support!");
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CameraStereoZed::isCalibrated() const
|
||||||
|
{
|
||||||
|
return stereoModel_.isValidForProjection();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CameraStereoZed::getSerial() const
|
||||||
|
{
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
if(zed_)
|
||||||
|
{
|
||||||
|
return uFormat("%x", zed_->getZEDSerial());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
SensorData CameraStereoZed::captureImage()
|
||||||
|
{
|
||||||
|
SensorData data;
|
||||||
|
#ifdef RTABMAP_ZED
|
||||||
|
if(zed_)
|
||||||
|
{
|
||||||
|
sl::zed::SENSING_MODE dm_type = sl::zed::RAW;
|
||||||
|
bool res = zed_->grab(dm_type);
|
||||||
|
|
||||||
|
if(!res)
|
||||||
|
{
|
||||||
|
// get left image
|
||||||
|
cv::Mat rgbaLeft = slMat2cvMat(zed_->retrieveImage(static_cast<sl::zed::SIDE> (sl::zed::STEREO_LEFT)));
|
||||||
|
cv::Mat left;
|
||||||
|
cv::cvtColor(rgbaLeft, left, cv::COLOR_BGRA2BGR);
|
||||||
|
|
||||||
|
if(rgbdMode_)
|
||||||
|
{
|
||||||
|
// get depth image
|
||||||
|
cv::Mat depth;
|
||||||
|
slMat2cvMat(zed_->retrieveMeasure(sl::zed::MEASURE::DEPTH)).copyTo(depth);
|
||||||
|
depth /= 1000.0;
|
||||||
|
|
||||||
|
data = SensorData(left, depth, stereoModel_.left(), this->getNextSeqID(), UTimer::now());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// get right image
|
||||||
|
cv::Mat rgbaRight = slMat2cvMat(zed_->retrieveImage(static_cast<sl::zed::SIDE> (sl::zed::STEREO_RIGHT)));
|
||||||
|
cv::Mat right;
|
||||||
|
cv::cvtColor(rgbaRight, right, cv::COLOR_BGRA2GRAY);
|
||||||
|
|
||||||
|
data = SensorData(left, right, stereoModel_, this->getNextSeqID(), UTimer::now());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("CameraStereoZed: Failed to grab images!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
UERROR("CameraStereoZED: RTAB-Map is not built with ZED sdk support!");
|
||||||
|
#endif
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// CameraStereoImages
|
// CameraStereoImages
|
||||||
//
|
//
|
||||||
@@ -921,7 +1071,21 @@ CameraStereoVideo::CameraStereoVideo(
|
|||||||
const Transform & localTransform) :
|
const Transform & localTransform) :
|
||||||
Camera(imageRate, localTransform),
|
Camera(imageRate, localTransform),
|
||||||
path_(path),
|
path_(path),
|
||||||
rectifyImages_(rectifyImages)
|
rectifyImages_(rectifyImages),
|
||||||
|
src_(CameraVideo::kVideoFile),
|
||||||
|
usbDevice_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CameraStereoVideo::CameraStereoVideo(
|
||||||
|
int device,
|
||||||
|
float imageRate,
|
||||||
|
const Transform & localTransform) :
|
||||||
|
Camera(imageRate, localTransform),
|
||||||
|
path_(""),
|
||||||
|
rectifyImages_(false),
|
||||||
|
src_(CameraVideo::kUsbDevice),
|
||||||
|
usbDevice_(device)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -932,29 +1096,51 @@ CameraStereoVideo::~CameraStereoVideo()
|
|||||||
|
|
||||||
bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::string & cameraName)
|
bool CameraStereoVideo::init(const std::string & calibrationFolder, const std::string & cameraName)
|
||||||
{
|
{
|
||||||
|
cameraName_ = cameraName;
|
||||||
if(capture_.isOpened())
|
if(capture_.isOpened())
|
||||||
{
|
{
|
||||||
capture_.release();
|
capture_.release();
|
||||||
}
|
}
|
||||||
ULOGGER_DEBUG("Camera: filename=\"%s\"", path_.c_str());
|
|
||||||
|
if (src_ == CameraVideo::kUsbDevice)
|
||||||
|
{
|
||||||
|
ULOGGER_DEBUG("CameraStereoVideo: Usb device initialization on device %d", usbDevice_);
|
||||||
|
capture_.open(usbDevice_);
|
||||||
|
}
|
||||||
|
else if (src_ == CameraVideo::kVideoFile)
|
||||||
|
{
|
||||||
|
ULOGGER_DEBUG("CameraStereoVideo: filename=\"%s\"", path_.c_str());
|
||||||
capture_.open(path_.c_str());
|
capture_.open(path_.c_str());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ULOGGER_ERROR("CameraStereoVideo: Unknown source...");
|
||||||
|
}
|
||||||
|
|
||||||
if(!capture_.isOpened())
|
if(!capture_.isOpened())
|
||||||
{
|
{
|
||||||
ULOGGER_ERROR("Camera: Failed to create a capture object!");
|
ULOGGER_ERROR("CameraStereoVideo: Failed to create a capture object!");
|
||||||
capture_.release();
|
capture_.release();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// look for calibration files
|
if (cameraName_.empty())
|
||||||
cameraName_ = cameraName;
|
|
||||||
if(!calibrationFolder.empty() && !cameraName.empty())
|
|
||||||
{
|
{
|
||||||
if(!stereoModel_.load(calibrationFolder, cameraName))
|
unsigned int guid = (unsigned int)capture_.get(CV_CAP_PROP_GUID);
|
||||||
|
if (guid != 0 && guid != 0xffffffff)
|
||||||
|
{
|
||||||
|
cameraName_ = uFormat("%08x", guid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// look for calibration files
|
||||||
|
if(!calibrationFolder.empty() && !cameraName_.empty())
|
||||||
|
{
|
||||||
|
if(!stereoModel_.load(calibrationFolder, cameraName_))
|
||||||
{
|
{
|
||||||
UWARN("Missing calibration files for camera \"%s\" in \"%s\" folder, you should calibrate the camera!",
|
UWARN("Missing calibration files for camera \"%s\" in \"%s\" folder, you should calibrate the camera!",
|
||||||
cameraName.c_str(), calibrationFolder.c_str());
|
cameraName_.c_str(), calibrationFolder.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1007,7 +1193,7 @@ SensorData CameraStereoVideo::captureImage()
|
|||||||
rightCvt = true;
|
rightCvt = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(rectifyImages_ && stereoModel_.left().isValidForRectification() && stereoModel_.right().isValidForRectification())
|
if((src_ != CameraVideo::kVideoFile || rectifyImages_) && stereoModel_.left().isValidForRectification() && stereoModel_.right().isValidForRectification())
|
||||||
{
|
{
|
||||||
leftImage = stereoModel_.left().rectifyImage(leftImage);
|
leftImage = stereoModel_.left().rectifyImage(leftImage);
|
||||||
rightImage = stereoModel_.right().rectifyImage(rightImage);
|
rightImage = stereoModel_.right().rectifyImage(rightImage);
|
||||||
|
|||||||
@@ -3425,7 +3425,7 @@ Signature * Memory::createSignature(const SensorData & data, const Transform & p
|
|||||||
UASSERT(keypoints3D.size() == 0 || keypoints3D.size() == wordIds.size());
|
UASSERT(keypoints3D.size() == 0 || keypoints3D.size() == wordIds.size());
|
||||||
unsigned int i=0;
|
unsigned int i=0;
|
||||||
float decimationRatio = preDecimation / _imagePostDecimation;
|
float decimationRatio = preDecimation / _imagePostDecimation;
|
||||||
double log2value = log(preDecimation)/log(2);
|
double log2value = log(double(preDecimation))/log(2.0);
|
||||||
for(std::list<int>::iterator iter=wordIds.begin(); iter!=wordIds.end() && i < keypoints.size(); ++iter, ++i)
|
for(std::list<int>::iterator iter=wordIds.begin(); iter!=wordIds.end() && i < keypoints.size(); ++iter, ++i)
|
||||||
{
|
{
|
||||||
cv::KeyPoint kpt = keypoints[i];
|
cv::KeyPoint kpt = keypoints[i];
|
||||||
|
|||||||
@@ -253,7 +253,7 @@ Transform Odometry::process(SensorData & data, OdometryInfo * info)
|
|||||||
|
|
||||||
// transform back the keypoints in the original image
|
// transform back the keypoints in the original image
|
||||||
std::vector<cv::KeyPoint> kpts = decimatedData.keypoints();
|
std::vector<cv::KeyPoint> kpts = decimatedData.keypoints();
|
||||||
double log2value = log(_imageDecimation)/log(2);
|
double log2value = log(double(_imageDecimation))/log(2.0);
|
||||||
for(unsigned int i=0; i<kpts.size(); ++i)
|
for(unsigned int i=0; i<kpts.size(); ++i)
|
||||||
{
|
{
|
||||||
kpts[i].pt.x *= _imageDecimation;
|
kpts[i].pt.x *= _imageDecimation;
|
||||||
|
|||||||
+5
-28
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/utilite/UTimer.h>
|
#include <rtabmap/utilite/UTimer.h>
|
||||||
#include <rtabmap/utilite/UStl.h>
|
#include <rtabmap/utilite/UStl.h>
|
||||||
#include <rtabmap/core/util3d_transforms.h>
|
#include <rtabmap/core/util3d_transforms.h>
|
||||||
|
#include <rtabmap/core/StereoDense.h>
|
||||||
#include <opencv2/calib3d/calib3d.hpp>
|
#include <opencv2/calib3d/calib3d.hpp>
|
||||||
#include <opencv2/imgproc/imgproc.hpp>
|
#include <opencv2/imgproc/imgproc.hpp>
|
||||||
#include <opencv2/video/tracking.hpp>
|
#include <opencv2/video/tracking.hpp>
|
||||||
@@ -724,12 +725,11 @@ void calcOpticalFlowPyrLKStereo( cv::InputArray _prevImg, cv::InputArray _nextIm
|
|||||||
cv::Mat disparityFromStereoImages(
|
cv::Mat disparityFromStereoImages(
|
||||||
const cv::Mat & leftImage,
|
const cv::Mat & leftImage,
|
||||||
const cv::Mat & rightImage,
|
const cv::Mat & rightImage,
|
||||||
int type)
|
const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
UASSERT(!leftImage.empty() && !rightImage.empty());
|
UASSERT(!leftImage.empty() && !rightImage.empty());
|
||||||
UASSERT(leftImage.cols == rightImage.cols && leftImage.rows == rightImage.rows);
|
UASSERT(leftImage.cols == rightImage.cols && leftImage.rows == rightImage.rows);
|
||||||
UASSERT((leftImage.type() == CV_8UC1 || leftImage.type() == CV_8UC3) && rightImage.type() == CV_8UC1);
|
UASSERT((leftImage.type() == CV_8UC1 || leftImage.type() == CV_8UC3) && rightImage.type() == CV_8UC1);
|
||||||
UASSERT(type == CV_32FC1 || type == CV_16SC1);
|
|
||||||
|
|
||||||
cv::Mat leftMono;
|
cv::Mat leftMono;
|
||||||
if(leftImage.channels() == 3)
|
if(leftImage.channels() == 3)
|
||||||
@@ -741,32 +741,9 @@ cv::Mat disparityFromStereoImages(
|
|||||||
leftMono = leftImage;
|
leftMono = leftImage;
|
||||||
}
|
}
|
||||||
cv::Mat disparity;
|
cv::Mat disparity;
|
||||||
#if CV_MAJOR_VERSION < 3
|
|
||||||
cv::StereoBM stereo(cv::StereoBM::BASIC_PRESET);
|
StereoBM stereo(parameters);
|
||||||
stereo.state->SADWindowSize = 15;
|
return stereo.computeDisparity(leftMono, rightImage);
|
||||||
stereo.state->minDisparity = 0;
|
|
||||||
stereo.state->numberOfDisparities = 64;
|
|
||||||
stereo.state->preFilterSize = 9;
|
|
||||||
stereo.state->preFilterCap = 31;
|
|
||||||
stereo.state->uniquenessRatio = 15;
|
|
||||||
stereo.state->textureThreshold = 10;
|
|
||||||
stereo.state->speckleWindowSize = 100;
|
|
||||||
stereo.state->speckleRange = 4;
|
|
||||||
stereo(leftMono, rightImage, disparity, type);
|
|
||||||
#else
|
|
||||||
cv::Ptr<cv::StereoBM> stereo = cv::StereoBM::create();
|
|
||||||
stereo->setBlockSize(15);
|
|
||||||
stereo->setMinDisparity(0);
|
|
||||||
stereo->setNumDisparities(64);
|
|
||||||
stereo->setPreFilterSize(9);
|
|
||||||
stereo->setPreFilterCap(31);
|
|
||||||
stereo->setUniquenessRatio(15);
|
|
||||||
stereo->setTextureThreshold(10);
|
|
||||||
stereo->setSpeckleWindowSize(100);
|
|
||||||
stereo->setSpeckleRange(4);
|
|
||||||
stereo->compute(leftMono, rightImage, disparity);
|
|
||||||
#endif
|
|
||||||
return disparity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cv::Mat depthFromDisparity(const cv::Mat & disparity,
|
cv::Mat depthFromDisparity(const cv::Mat & disparity,
|
||||||
|
|||||||
+10
-6
@@ -588,7 +588,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromStereoImages(
|
|||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices,
|
||||||
|
const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
UASSERT(!imageLeft.empty() && !imageRight.empty());
|
UASSERT(!imageLeft.empty() && !imageRight.empty());
|
||||||
UASSERT(imageRight.type() == CV_8UC1);
|
UASSERT(imageRight.type() == CV_8UC1);
|
||||||
@@ -623,7 +624,7 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFromStereoImages(
|
|||||||
|
|
||||||
return cloudFromDisparityRGB(
|
return cloudFromDisparityRGB(
|
||||||
leftColor,
|
leftColor,
|
||||||
util2d::disparityFromStereoImages(leftMono, rightMono),
|
util2d::disparityFromStereoImages(leftMono, rightMono, parameters),
|
||||||
modelDecimation,
|
modelDecimation,
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
@@ -636,7 +637,8 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
|||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices,
|
||||||
|
const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
|
|
||||||
@@ -696,7 +698,7 @@ pcl::PointCloud<pcl::PointXYZ>::Ptr RTABMAP_EXP cloudFromSensorData(
|
|||||||
leftMono = sensorData.imageRaw();
|
leftMono = sensorData.imageRaw();
|
||||||
}
|
}
|
||||||
cloud = cloudFromDisparity(
|
cloud = cloudFromDisparity(
|
||||||
util2d::disparityFromStereoImages(leftMono, sensorData.rightRaw()),
|
util2d::disparityFromStereoImages(leftMono, sensorData.rightRaw(), parameters),
|
||||||
sensorData.stereoCameraModel(),
|
sensorData.stereoCameraModel(),
|
||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
@@ -719,7 +721,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
int decimation,
|
int decimation,
|
||||||
float maxDepth,
|
float maxDepth,
|
||||||
float minDepth,
|
float minDepth,
|
||||||
std::vector<int> * validIndices)
|
std::vector<int> * validIndices,
|
||||||
|
const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
UASSERT(!sensorData.imageRaw().empty());
|
UASSERT(!sensorData.imageRaw().empty());
|
||||||
UASSERT((!sensorData.depthRaw().empty() && sensorData.cameraModels().size()) ||
|
UASSERT((!sensorData.depthRaw().empty() && sensorData.cameraModels().size()) ||
|
||||||
@@ -804,7 +807,8 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
|
|||||||
decimation,
|
decimation,
|
||||||
maxDepth,
|
maxDepth,
|
||||||
minDepth,
|
minDepth,
|
||||||
validIndices);
|
validIndices,
|
||||||
|
parameters);
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <rtabmap/utilite/UEventsHandler.h>
|
#include <rtabmap/utilite/UEventsHandler.h>
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <rtabmap/core/SensorData.h>
|
#include <rtabmap/core/SensorData.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
|
||||||
class QSpinBox;
|
class QSpinBox;
|
||||||
class QCheckBox;
|
class QCheckBox;
|
||||||
@@ -47,7 +48,9 @@ class RTABMAPGUI_EXP CameraViewer : public QDialog, public UEventsHandler
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
CameraViewer(QWidget * parent = 0);
|
CameraViewer(
|
||||||
|
QWidget * parent = 0,
|
||||||
|
const ParametersMap & parameters = ParametersMap());
|
||||||
virtual ~CameraViewer();
|
virtual ~CameraViewer();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -61,6 +64,7 @@ private:
|
|||||||
bool processingImages_;
|
bool processingImages_;
|
||||||
QSpinBox * decimationSpin_;
|
QSpinBox * decimationSpin_;
|
||||||
int validDecimationValue_;
|
int validDecimationValue_;
|
||||||
|
ParametersMap parameters_;
|
||||||
QPushButton * pause_;
|
QPushButton * pause_;
|
||||||
QCheckBox * showCloudCheckbox_;
|
QCheckBox * showCloudCheckbox_;
|
||||||
QCheckBox * showScanCheckbox_;
|
QCheckBox * showScanCheckbox_;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public slots:
|
|||||||
void setDecimation(int decimation) {decimation_ = decimation;}
|
void setDecimation(int decimation) {decimation_ = decimation;}
|
||||||
void setMaxDepth(int maxDepth) {maxDepth_ = maxDepth;}
|
void setMaxDepth(int maxDepth) {maxDepth_ = maxDepth;}
|
||||||
void setMinDepth(int minDepth) {minDepth_ = minDepth;}
|
void setMinDepth(int minDepth) {minDepth_ = minDepth;}
|
||||||
void updateView(const Transform & AtoB = Transform());
|
void updateView(const Transform & AtoB = Transform(), const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void showEvent(QShowEvent * event);
|
virtual void showEvent(QShowEvent * event);
|
||||||
|
|||||||
@@ -153,6 +153,8 @@ private slots:
|
|||||||
void selectFreenect2();
|
void selectFreenect2();
|
||||||
void selectStereoDC1394();
|
void selectStereoDC1394();
|
||||||
void selectStereoFlyCapture2();
|
void selectStereoFlyCapture2();
|
||||||
|
void selectStereoZed();
|
||||||
|
void selectStereoUsb();
|
||||||
void dumpTheMemory();
|
void dumpTheMemory();
|
||||||
void dumpThePrediction();
|
void dumpThePrediction();
|
||||||
void sendGoal();
|
void sendGoal();
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include "rtabmap/gui/RtabmapGuiExp.h" // DLL export/import defines
|
#include "rtabmap/gui/RtabmapGuiExp.h" // DLL export/import defines
|
||||||
|
|
||||||
#include "rtabmap/core/OdometryEvent.h"
|
#include "rtabmap/core/OdometryEvent.h"
|
||||||
|
#include "rtabmap/core/Parameters.h"
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include "rtabmap/utilite/UEventsHandler.h"
|
#include "rtabmap/utilite/UEventsHandler.h"
|
||||||
|
|
||||||
@@ -49,7 +50,14 @@ class RTABMAPGUI_EXP OdometryViewer : public QDialog, public UEventsHandler
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OdometryViewer(int maxClouds = 10, int decimation = 2, float voxelSize = 0.0f, float maxDepth = 0, int qualityWarningThr=0, QWidget * parent = 0);
|
OdometryViewer(
|
||||||
|
int maxClouds = 10,
|
||||||
|
int decimation = 2,
|
||||||
|
float voxelSize = 0.0f,
|
||||||
|
float maxDepth = 0,
|
||||||
|
int qualityWarningThr=0,
|
||||||
|
QWidget * parent = 0,
|
||||||
|
const ParametersMap & parameters = ParametersMap());
|
||||||
virtual ~OdometryViewer();
|
virtual ~OdometryViewer();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -83,6 +91,7 @@ private:
|
|||||||
QCheckBox * featuresShown_;
|
QCheckBox * featuresShown_;
|
||||||
QLabel * timeLabel_;
|
QLabel * timeLabel_;
|
||||||
int validDecimationValue_;
|
int validDecimationValue_;
|
||||||
|
ParametersMap parameters_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ public:
|
|||||||
kSrcFlyCapture2 = 101,
|
kSrcFlyCapture2 = 101,
|
||||||
kSrcStereoImages = 102,
|
kSrcStereoImages = 102,
|
||||||
kSrcStereoVideo = 103,
|
kSrcStereoVideo = 103,
|
||||||
|
kSrcStereoZed = 104,
|
||||||
|
kSrcStereoUsb = 105,
|
||||||
|
|
||||||
kSrcRGB = 200,
|
kSrcRGB = 200,
|
||||||
kSrcUsbDevice = 200,
|
kSrcUsbDevice = 200,
|
||||||
|
|||||||
@@ -47,12 +47,13 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
|
|
||||||
CameraViewer::CameraViewer(QWidget * parent) :
|
CameraViewer::CameraViewer(QWidget * parent, const ParametersMap & parameters) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
imageView_(new ImageView(this)),
|
imageView_(new ImageView(this)),
|
||||||
cloudView_(new CloudViewer(this)),
|
cloudView_(new CloudViewer(this)),
|
||||||
processingImages_(false),
|
processingImages_(false),
|
||||||
validDecimationValue_(1)
|
validDecimationValue_(1),
|
||||||
|
parameters_(parameters)
|
||||||
{
|
{
|
||||||
qRegisterMetaType<rtabmap::SensorData>("rtabmap::SensorData");
|
qRegisterMetaType<rtabmap::SensorData>("rtabmap::SensorData");
|
||||||
|
|
||||||
@@ -146,12 +147,12 @@ void CameraViewer::showImage(const rtabmap::SensorData & data)
|
|||||||
if(!data.imageRaw().empty() && !data.depthOrRightRaw().empty())
|
if(!data.imageRaw().empty() && !data.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
showCloudCheckbox_->setEnabled(true);
|
showCloudCheckbox_->setEnabled(true);
|
||||||
cloudView_->addCloud("cloud", util3d::cloudRGBFromSensorData(data, validDecimationValue_));
|
cloudView_->addCloud("cloud", util3d::cloudRGBFromSensorData(data, validDecimationValue_, 0, 0, 0, parameters_));
|
||||||
}
|
}
|
||||||
else if(!data.depthOrRightRaw().empty())
|
else if(!data.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
showCloudCheckbox_->setEnabled(true);
|
showCloudCheckbox_->setEnabled(true);
|
||||||
cloudView_->addCloud("cloud", util3d::cloudFromSensorData(data, validDecimationValue_));
|
cloudView_->addCloud("cloud", util3d::cloudFromSensorData(data, validDecimationValue_, 0, 0, 0, parameters_));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1509,7 +1509,7 @@ void DatabaseViewer::view3DMap()
|
|||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
|
||||||
UASSERT(data.imageRaw().empty() || data.imageRaw().type()==CV_8UC3 || data.imageRaw().type() == CV_8UC1);
|
UASSERT(data.imageRaw().empty() || data.imageRaw().type()==CV_8UC3 || data.imageRaw().type() == CV_8UC1);
|
||||||
UASSERT(data.depthOrRightRaw().empty() || data.depthOrRightRaw().type()==CV_8UC1 || data.depthOrRightRaw().type() == CV_16UC1 || data.depthOrRightRaw().type() == CV_32FC1);
|
UASSERT(data.depthOrRightRaw().empty() || data.depthOrRightRaw().type()==CV_8UC1 || data.depthOrRightRaw().type() == CV_16UC1 || data.depthOrRightRaw().type() == CV_32FC1);
|
||||||
cloud = util3d::cloudRGBFromSensorData(data, decimation, maxDepth);
|
cloud = util3d::cloudRGBFromSensorData(data, decimation, maxDepth, 0, 0, ui_->parameters_toolbox->getParameters());
|
||||||
|
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
@@ -1733,7 +1733,7 @@ void DatabaseViewer::generate3DMap()
|
|||||||
UASSERT(data.imageRaw().empty() || data.imageRaw().type()==CV_8UC3 || data.imageRaw().type() == CV_8UC1);
|
UASSERT(data.imageRaw().empty() || data.imageRaw().type()==CV_8UC3 || data.imageRaw().type() == CV_8UC1);
|
||||||
UASSERT(data.depthOrRightRaw().empty() || data.depthOrRightRaw().type()==CV_8UC1 || data.depthOrRightRaw().type() == CV_16UC1 || data.depthOrRightRaw().type() == CV_32FC1);
|
UASSERT(data.depthOrRightRaw().empty() || data.depthOrRightRaw().type()==CV_8UC1 || data.depthOrRightRaw().type() == CV_16UC1 || data.depthOrRightRaw().type() == CV_32FC1);
|
||||||
pcl::IndicesPtr validIndices(new std::vector<int>);
|
pcl::IndicesPtr validIndices(new std::vector<int>);
|
||||||
cloud = util3d::cloudRGBFromSensorData(data, decimation, maxDepth, 0, validIndices.get());
|
cloud = util3d::cloudRGBFromSensorData(data, decimation, maxDepth, 0, validIndices.get(), ui_->parameters_toolbox->getParameters());
|
||||||
|
|
||||||
if(assemble)
|
if(assemble)
|
||||||
{
|
{
|
||||||
@@ -2275,7 +2275,7 @@ void DatabaseViewer::update(int value,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cloud = util3d::cloudRGBFromSensorData(data);
|
cloud = util3d::cloudRGBFromSensorData(data, 1, 0, 0, 0, ui_->parameters_toolbox->getParameters());
|
||||||
}
|
}
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
@@ -2312,7 +2312,7 @@ void DatabaseViewer::update(int value,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
|
||||||
cloud = util3d::cloudFromSensorData(data);
|
cloud = util3d::cloudFromSensorData(data, 1, 0, 0, 0, ui_->parameters_toolbox->getParameters());
|
||||||
if(cloud->size())
|
if(cloud->size())
|
||||||
{
|
{
|
||||||
view3D->addCloud("0", cloud);
|
view3D->addCloud("0", cloud);
|
||||||
@@ -2945,11 +2945,11 @@ void DatabaseViewer::updateConstraintView(
|
|||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFrom, cloudTo;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudFrom, cloudTo;
|
||||||
if(!dataFrom.imageRaw().empty() && !dataFrom.depthOrRightRaw().empty())
|
if(!dataFrom.imageRaw().empty() && !dataFrom.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
cloudFrom=util3d::cloudRGBFromSensorData(dataFrom, 1);
|
cloudFrom=util3d::cloudRGBFromSensorData(dataFrom, 1, 0, 0, 0, ui_->parameters_toolbox->getParameters());
|
||||||
}
|
}
|
||||||
if(!dataTo.imageRaw().empty() && !dataTo.depthOrRightRaw().empty())
|
if(!dataTo.imageRaw().empty() && !dataTo.depthOrRightRaw().empty())
|
||||||
{
|
{
|
||||||
cloudTo=util3d::cloudRGBFromSensorData(dataTo, 1);
|
cloudTo=util3d::cloudRGBFromSensorData(dataTo, 1, 0, 0, 0, ui_->parameters_toolbox->getParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cloudFrom.get() && cloudFrom->size())
|
if(cloudFrom.get() && cloudFrom->size())
|
||||||
@@ -3346,7 +3346,8 @@ void DatabaseViewer::sliderIterationsValueChanged(int value)
|
|||||||
ui_->spinBox_projDecimation->value(),
|
ui_->spinBox_projDecimation->value(),
|
||||||
ui_->doubleSpinBox_projMaxDepth->value(),
|
ui_->doubleSpinBox_projMaxDepth->value(),
|
||||||
ui_->doubleSpinBox_projMinDepth->value(),
|
ui_->doubleSpinBox_projMinDepth->value(),
|
||||||
validIndices.get());
|
validIndices.get(),
|
||||||
|
ui_->parameters_toolbox->getParameters());
|
||||||
UASSERT(ui_->doubleSpinBox_gridCellSize->value() > 0);
|
UASSERT(ui_->doubleSpinBox_gridCellSize->value() > 0);
|
||||||
cloud = util3d::voxelize(cloud, validIndices, ui_->doubleSpinBox_gridCellSize->value());
|
cloud = util3d::voxelize(cloud, validIndices, ui_->doubleSpinBox_gridCellSize->value());
|
||||||
|
|
||||||
@@ -3793,12 +3794,16 @@ void DatabaseViewer::refineConstraint(int from, int to, bool silent, bool update
|
|||||||
dataFrom,
|
dataFrom,
|
||||||
ui_->spinBox_icp_decimation->value(),
|
ui_->spinBox_icp_decimation->value(),
|
||||||
ui_->doubleSpinBox_icp_maxDepth->value(),
|
ui_->doubleSpinBox_icp_maxDepth->value(),
|
||||||
ui_->doubleSpinBox_icp_minDepth->value());
|
ui_->doubleSpinBox_icp_minDepth->value(),
|
||||||
|
0,
|
||||||
|
ui_->parameters_toolbox->getParameters());
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudTo = util3d::cloudFromSensorData(
|
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudTo = util3d::cloudFromSensorData(
|
||||||
dataTo,
|
dataTo,
|
||||||
ui_->spinBox_icp_decimation->value(),
|
ui_->spinBox_icp_decimation->value(),
|
||||||
ui_->doubleSpinBox_icp_maxDepth->value(),
|
ui_->doubleSpinBox_icp_maxDepth->value(),
|
||||||
ui_->doubleSpinBox_icp_minDepth->value());
|
ui_->doubleSpinBox_icp_minDepth->value(),
|
||||||
|
0,
|
||||||
|
ui_->parameters_toolbox->getParameters());
|
||||||
int maxLaserScans = cloudFrom->size();
|
int maxLaserScans = cloudFrom->size();
|
||||||
dataFrom.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudFrom), Transform()), maxLaserScans, 0);
|
dataFrom.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudFrom), Transform()), maxLaserScans, 0);
|
||||||
dataTo.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudTo), Transform()), maxLaserScans, 0);
|
dataTo.setLaserScanRaw(util3d::laserScanFromPointCloud(*util3d::removeNaNFromPointCloud(cloudTo), Transform()), maxLaserScans, 0);
|
||||||
|
|||||||
@@ -337,7 +337,8 @@ void ExportCloudsDialog::exportClouds(
|
|||||||
const std::map<int, int> & mapIds,
|
const std::map<int, int> & mapIds,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
const QString & workingDirectory)
|
const QString & workingDirectory,
|
||||||
|
const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> clouds;
|
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> clouds;
|
||||||
std::map<int, pcl::PolygonMesh::Ptr> meshes;
|
std::map<int, pcl::PolygonMesh::Ptr> meshes;
|
||||||
@@ -351,6 +352,7 @@ void ExportCloudsDialog::exportClouds(
|
|||||||
cachedSignatures,
|
cachedSignatures,
|
||||||
createdClouds,
|
createdClouds,
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
|
parameters,
|
||||||
clouds,
|
clouds,
|
||||||
meshes,
|
meshes,
|
||||||
textureMeshes))
|
textureMeshes))
|
||||||
@@ -387,7 +389,8 @@ void ExportCloudsDialog::viewClouds(
|
|||||||
const std::map<int, int> & mapIds,
|
const std::map<int, int> & mapIds,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
const QString & workingDirectory)
|
const QString & workingDirectory,
|
||||||
|
const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> clouds;
|
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> clouds;
|
||||||
std::map<int, pcl::PolygonMesh::Ptr> meshes;
|
std::map<int, pcl::PolygonMesh::Ptr> meshes;
|
||||||
@@ -401,6 +404,7 @@ void ExportCloudsDialog::viewClouds(
|
|||||||
cachedSignatures,
|
cachedSignatures,
|
||||||
createdClouds,
|
createdClouds,
|
||||||
workingDirectory,
|
workingDirectory,
|
||||||
|
parameters,
|
||||||
clouds,
|
clouds,
|
||||||
meshes,
|
meshes,
|
||||||
textureMeshes))
|
textureMeshes))
|
||||||
@@ -517,6 +521,7 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
const QString & workingDirectory,
|
const QString & workingDirectory,
|
||||||
|
const ParametersMap & parameters,
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> & cloudsWithNormals,
|
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> & cloudsWithNormals,
|
||||||
std::map<int, pcl::PolygonMesh::Ptr> & meshes,
|
std::map<int, pcl::PolygonMesh::Ptr> & meshes,
|
||||||
std::map<int, pcl::TextureMesh::Ptr> & textureMeshes)
|
std::map<int, pcl::TextureMesh::Ptr> & textureMeshes)
|
||||||
@@ -550,7 +555,8 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > clouds = this->getClouds(
|
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > clouds = this->getClouds(
|
||||||
poses,
|
poses,
|
||||||
cachedSignatures,
|
cachedSignatures,
|
||||||
createdClouds);
|
createdClouds,
|
||||||
|
parameters);
|
||||||
|
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr rawAssembledCloud(new pcl::PointCloud<pcl::PointXYZ>);
|
pcl::PointCloud<pcl::PointXYZ>::Ptr rawAssembledCloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
std::vector<int> rawCameraIndices;
|
std::vector<int> rawCameraIndices;
|
||||||
@@ -1006,7 +1012,8 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > ExportCloudsDialog::getClouds(
|
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > ExportCloudsDialog::getClouds(
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds) const
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
|
const ParametersMap & parameters) const
|
||||||
{
|
{
|
||||||
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > clouds;
|
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > clouds;
|
||||||
int i=0;
|
int i=0;
|
||||||
@@ -1038,7 +1045,8 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
_ui->spinBox_decimation->value(),
|
_ui->spinBox_decimation->value(),
|
||||||
_ui->doubleSpinBox_maxDepth->value(),
|
_ui->doubleSpinBox_maxDepth->value(),
|
||||||
_ui->doubleSpinBox_minDepth->value(),
|
_ui->doubleSpinBox_minDepth->value(),
|
||||||
indices.get());
|
indices.get(),
|
||||||
|
parameters);
|
||||||
|
|
||||||
// Don't voxelize if we create organized mesh
|
// Don't voxelize if we create organized mesh
|
||||||
if(!(_ui->comboBox_pipeline->currentIndex()==0 && _ui->groupBox_meshing->isChecked()))
|
if(!(_ui->comboBox_pipeline->currentIndex()==0 && _ui->groupBox_meshing->isChecked()))
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <QtCore/QSettings>
|
#include <QtCore/QSettings>
|
||||||
|
|
||||||
#include <rtabmap/core/Signature.h>
|
#include <rtabmap/core/Signature.h>
|
||||||
|
#include <rtabmap/core/Parameters.h>
|
||||||
|
|
||||||
#include <pcl/point_cloud.h>
|
#include <pcl/point_cloud.h>
|
||||||
#include <pcl/point_types.h>
|
#include <pcl/point_types.h>
|
||||||
@@ -63,14 +64,16 @@ public:
|
|||||||
const std::map<int, int> & mapIds,
|
const std::map<int, int> & mapIds,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
const QString & workingDirectory);
|
const QString & workingDirectory,
|
||||||
|
const ParametersMap & parameters);
|
||||||
|
|
||||||
void viewClouds(
|
void viewClouds(
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::map<int, int> & mapIds,
|
const std::map<int, int> & mapIds,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
const QString & workingDirectory);
|
const QString & workingDirectory,
|
||||||
|
const ParametersMap & parameters);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void configChanged();
|
void configChanged();
|
||||||
@@ -86,13 +89,15 @@ private:
|
|||||||
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > getClouds(
|
std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > getClouds(
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds) const;
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
|
const ParametersMap & parameters) const;
|
||||||
bool getExportedClouds(
|
bool getExportedClouds(
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
const std::map<int, int> & mapIds,
|
const std::map<int, int> & mapIds,
|
||||||
const QMap<int, Signature> & cachedSignatures,
|
const QMap<int, Signature> & cachedSignatures,
|
||||||
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
const std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::IndicesPtr> > & createdClouds,
|
||||||
const QString & workingDirectory,
|
const QString & workingDirectory,
|
||||||
|
const ParametersMap & parameters,
|
||||||
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> & clouds,
|
std::map<int, pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr> & clouds,
|
||||||
std::map<int, pcl::PolygonMesh::Ptr> & meshes,
|
std::map<int, pcl::PolygonMesh::Ptr> & meshes,
|
||||||
std::map<int, pcl::TextureMesh::Ptr> & textureMeshes);
|
std::map<int, pcl::TextureMesh::Ptr> & textureMeshes);
|
||||||
|
|||||||
@@ -30,5 +30,6 @@
|
|||||||
<file>images/xtion_pro_live.png</file>
|
<file>images/xtion_pro_live.png</file>
|
||||||
<file>images/bumblebee2.png</file>
|
<file>images/bumblebee2.png</file>
|
||||||
<file>images/webcam.png</file>
|
<file>images/webcam.png</file>
|
||||||
|
<file>images/zed.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ void LoopClosureViewer::setData(const Signature & sA, const Signature & sB)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoopClosureViewer::updateView(const Transform & transform)
|
void LoopClosureViewer::updateView(const Transform & transform, const ParametersMap & parameters)
|
||||||
{
|
{
|
||||||
if(sA_.id()>0 && sB_.id()>0)
|
if(sA_.id()>0 && sB_.id()>0)
|
||||||
{
|
{
|
||||||
@@ -106,8 +106,8 @@ void LoopClosureViewer::updateView(const Transform & transform)
|
|||||||
{
|
{
|
||||||
//cloud 3d
|
//cloud 3d
|
||||||
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudA, cloudB;
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudA, cloudB;
|
||||||
cloudA = util3d::cloudRGBFromSensorData(sA_.sensorData(), decimation, maxDepth, minDepth);
|
cloudA = util3d::cloudRGBFromSensorData(sA_.sensorData(), decimation, maxDepth, minDepth, 0, parameters);
|
||||||
cloudB = util3d::cloudRGBFromSensorData(sB_.sensorData(), decimation, maxDepth, minDepth);
|
cloudB = util3d::cloudRGBFromSensorData(sB_.sensorData(), decimation, maxDepth, minDepth, 0, parameters);
|
||||||
|
|
||||||
//cloud 2d
|
//cloud 2d
|
||||||
pcl::PointCloud<pcl::PointXYZ>::Ptr scanA, scanB;
|
pcl::PointCloud<pcl::PointXYZ>::Ptr scanA, scanB;
|
||||||
|
|||||||
@@ -399,6 +399,8 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent) :
|
|||||||
connect(_ui->actionFreenect2, SIGNAL(triggered()), this, SLOT(selectFreenect2()));
|
connect(_ui->actionFreenect2, SIGNAL(triggered()), this, SLOT(selectFreenect2()));
|
||||||
connect(_ui->actionStereoDC1394, SIGNAL(triggered()), this, SLOT(selectStereoDC1394()));
|
connect(_ui->actionStereoDC1394, SIGNAL(triggered()), this, SLOT(selectStereoDC1394()));
|
||||||
connect(_ui->actionStereoFlyCapture2, SIGNAL(triggered()), this, SLOT(selectStereoFlyCapture2()));
|
connect(_ui->actionStereoFlyCapture2, SIGNAL(triggered()), this, SLOT(selectStereoFlyCapture2()));
|
||||||
|
connect(_ui->actionStereoZed, SIGNAL(triggered()), this, SLOT(selectStereoZed()));
|
||||||
|
connect(_ui->actionStereoUsb, SIGNAL(triggered()), this, SLOT(selectStereoUsb()));
|
||||||
_ui->actionFreenect->setEnabled(CameraFreenect::available());
|
_ui->actionFreenect->setEnabled(CameraFreenect::available());
|
||||||
_ui->actionOpenNI_CV->setEnabled(CameraOpenNICV::available());
|
_ui->actionOpenNI_CV->setEnabled(CameraOpenNICV::available());
|
||||||
_ui->actionOpenNI_CV_ASUS->setEnabled(CameraOpenNICV::available());
|
_ui->actionOpenNI_CV_ASUS->setEnabled(CameraOpenNICV::available());
|
||||||
@@ -408,6 +410,7 @@ MainWindow::MainWindow(PreferencesDialog * prefDialog, QWidget * parent) :
|
|||||||
_ui->actionFreenect2->setEnabled(CameraFreenect2::available());
|
_ui->actionFreenect2->setEnabled(CameraFreenect2::available());
|
||||||
_ui->actionStereoDC1394->setEnabled(CameraStereoDC1394::available());
|
_ui->actionStereoDC1394->setEnabled(CameraStereoDC1394::available());
|
||||||
_ui->actionStereoFlyCapture2->setEnabled(CameraStereoFlyCapture2::available());
|
_ui->actionStereoFlyCapture2->setEnabled(CameraStereoFlyCapture2::available());
|
||||||
|
_ui->actionStereoZed->setEnabled(CameraStereoZed::available());
|
||||||
this->updateSelectSourceMenu();
|
this->updateSelectSourceMenu();
|
||||||
|
|
||||||
connect(_ui->actionPreferences, SIGNAL(triggered()), this, SLOT(openPreferences()));
|
connect(_ui->actionPreferences, SIGNAL(triggered()), this, SLOT(openPreferences()));
|
||||||
@@ -884,7 +887,8 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom)
|
|||||||
_preferencesDialog->getCloudDecimation(1),
|
_preferencesDialog->getCloudDecimation(1),
|
||||||
_preferencesDialog->getCloudMaxDepth(1),
|
_preferencesDialog->getCloudMaxDepth(1),
|
||||||
_preferencesDialog->getCloudMinDepth(1),
|
_preferencesDialog->getCloudMinDepth(1),
|
||||||
indices.get());
|
indices.get(),
|
||||||
|
_preferencesDialog->getAllParameters());
|
||||||
if(indices->size())
|
if(indices->size())
|
||||||
{
|
{
|
||||||
cloud = util3d::transformPointCloud(cloud, pose);
|
cloud = util3d::transformPointCloud(cloud, pose);
|
||||||
@@ -1587,7 +1591,7 @@ void MainWindow::processStats(const rtabmap::Statistics & stat)
|
|||||||
if(_ui->dockWidget_loopClosureViewer->isVisible())
|
if(_ui->dockWidget_loopClosureViewer->isVisible())
|
||||||
{
|
{
|
||||||
UTimer loopTimer;
|
UTimer loopTimer;
|
||||||
_loopClosureViewer->updateView();
|
_loopClosureViewer->updateView(Transform(), _preferencesDialog->getAllParameters());
|
||||||
UINFO("Updating loop closure cloud view time=%fs", loopTimer.elapsed());
|
UINFO("Updating loop closure cloud view time=%fs", loopTimer.elapsed());
|
||||||
_ui->statsToolBox->updateStat("GUI/RGB-D closure view/ms", stat.refImageId(), int(loopTimer.elapsed()*1000.0f));
|
_ui->statsToolBox->updateStat("GUI/RGB-D closure view/ms", stat.refImageId(), int(loopTimer.elapsed()*1000.0f));
|
||||||
}
|
}
|
||||||
@@ -2219,7 +2223,8 @@ void MainWindow::createAndAddCloudToMap(int nodeId, const Transform & pose, int
|
|||||||
_preferencesDialog->getCloudDecimation(0),
|
_preferencesDialog->getCloudDecimation(0),
|
||||||
_preferencesDialog->getCloudMaxDepth(0),
|
_preferencesDialog->getCloudMaxDepth(0),
|
||||||
_preferencesDialog->getCloudMinDepth(0),
|
_preferencesDialog->getCloudMinDepth(0),
|
||||||
indices.get());
|
indices.get(),
|
||||||
|
_preferencesDialog->getAllParameters());
|
||||||
|
|
||||||
//compute normals
|
//compute normals
|
||||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud = util3d::computeNormals(cloudWithoutNormals, 10);
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud = util3d::computeNormals(cloudWithoutNormals, 10);
|
||||||
@@ -2560,7 +2565,7 @@ Transform MainWindow::alignPosesToGroundTruth(
|
|||||||
Transform t = Transform::getIdentity();
|
Transform t = Transform::getIdentity();
|
||||||
if(groundTruth.size() && poses.size())
|
if(groundTruth.size() && poses.size())
|
||||||
{
|
{
|
||||||
unsigned int maxSize = poses.size()>groundTruth.size()?poses.size():groundTruth.size();
|
unsigned int maxSize = poses.size()>groundTruth.size()? (unsigned int)poses.size(): (unsigned int)groundTruth.size();
|
||||||
pcl::PointCloud<pcl::PointXYZ> cloud1, cloud2;
|
pcl::PointCloud<pcl::PointXYZ> cloud1, cloud2;
|
||||||
cloud1.resize(maxSize);
|
cloud1.resize(maxSize);
|
||||||
cloud2.resize(maxSize);
|
cloud2.resize(maxSize);
|
||||||
@@ -3240,7 +3245,10 @@ void MainWindow::updateSelectSourceMenu()
|
|||||||
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcDatabase ||
|
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcDatabase ||
|
||||||
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcImages ||
|
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcImages ||
|
||||||
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcVideo ||
|
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcVideo ||
|
||||||
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcStereoImages);
|
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcStereoImages ||
|
||||||
|
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcStereoVideo ||
|
||||||
|
_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcRGBDImages
|
||||||
|
);
|
||||||
|
|
||||||
_ui->actionOpenNI_PCL->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcOpenNI_PCL);
|
_ui->actionOpenNI_PCL->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcOpenNI_PCL);
|
||||||
_ui->actionOpenNI_PCL_ASUS->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcOpenNI_PCL);
|
_ui->actionOpenNI_PCL_ASUS->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcOpenNI_PCL);
|
||||||
@@ -3253,6 +3261,8 @@ void MainWindow::updateSelectSourceMenu()
|
|||||||
_ui->actionFreenect2->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcFreenect2);
|
_ui->actionFreenect2->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcFreenect2);
|
||||||
_ui->actionStereoDC1394->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcDC1394);
|
_ui->actionStereoDC1394->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcDC1394);
|
||||||
_ui->actionStereoFlyCapture2->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcFlyCapture2);
|
_ui->actionStereoFlyCapture2->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcFlyCapture2);
|
||||||
|
_ui->actionStereoZed->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcStereoZed);
|
||||||
|
_ui->actionStereoUsb->setChecked(_preferencesDialog->getSourceDriver() == PreferencesDialog::kSrcStereoUsb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::changeImgRateSetting()
|
void MainWindow::changeImgRateSetting()
|
||||||
@@ -4449,7 +4459,15 @@ void MainWindow::selectStereoFlyCapture2()
|
|||||||
{
|
{
|
||||||
_preferencesDialog->selectSourceDriver(PreferencesDialog::kSrcFlyCapture2);
|
_preferencesDialog->selectSourceDriver(PreferencesDialog::kSrcFlyCapture2);
|
||||||
}
|
}
|
||||||
|
void MainWindow::selectStereoZed()
|
||||||
|
{
|
||||||
|
_preferencesDialog->selectSourceDriver(PreferencesDialog::kSrcStereoZed);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::selectStereoUsb()
|
||||||
|
{
|
||||||
|
_preferencesDialog->selectSourceDriver(PreferencesDialog::kSrcStereoUsb);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::dumpTheMemory()
|
void MainWindow::dumpTheMemory()
|
||||||
{
|
{
|
||||||
@@ -5089,7 +5107,8 @@ void MainWindow::exportClouds()
|
|||||||
_currentMapIds,
|
_currentMapIds,
|
||||||
_cachedSignatures,
|
_cachedSignatures,
|
||||||
_createdClouds,
|
_createdClouds,
|
||||||
_preferencesDialog->getWorkingDirectory());
|
_preferencesDialog->getWorkingDirectory(),
|
||||||
|
_preferencesDialog->getAllParameters());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::viewClouds()
|
void MainWindow::viewClouds()
|
||||||
@@ -5104,7 +5123,8 @@ void MainWindow::viewClouds()
|
|||||||
_currentMapIds,
|
_currentMapIds,
|
||||||
_cachedSignatures,
|
_cachedSignatures,
|
||||||
_createdClouds,
|
_createdClouds,
|
||||||
_preferencesDialog->getWorkingDirectory());
|
_preferencesDialog->getWorkingDirectory(),
|
||||||
|
_preferencesDialog->getAllParameters());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
OdometryViewer::OdometryViewer(int maxClouds, int decimation, float voxelSize, float maxDepth, int qualityWarningThr, QWidget * parent) :
|
OdometryViewer::OdometryViewer(
|
||||||
|
int maxClouds,
|
||||||
|
int decimation,
|
||||||
|
float voxelSize,
|
||||||
|
float maxDepth,
|
||||||
|
int qualityWarningThr,
|
||||||
|
QWidget * parent,
|
||||||
|
const ParametersMap & parameters) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
imageView_(new ImageView(this)),
|
imageView_(new ImageView(this)),
|
||||||
cloudView_(new CloudViewer(this)),
|
cloudView_(new CloudViewer(this)),
|
||||||
@@ -59,7 +66,8 @@ OdometryViewer::OdometryViewer(int maxClouds, int decimation, float voxelSize, f
|
|||||||
lastOdomPose_(Transform::getIdentity()),
|
lastOdomPose_(Transform::getIdentity()),
|
||||||
qualityWarningThr_(qualityWarningThr),
|
qualityWarningThr_(qualityWarningThr),
|
||||||
id_(0),
|
id_(0),
|
||||||
validDecimationValue_(1)
|
validDecimationValue_(1),
|
||||||
|
parameters_(parameters)
|
||||||
{
|
{
|
||||||
|
|
||||||
qRegisterMetaType<rtabmap::OdometryEvent>("rtabmap::OdometryEvent");
|
qRegisterMetaType<rtabmap::OdometryEvent>("rtabmap::OdometryEvent");
|
||||||
@@ -241,7 +249,8 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
|
|||||||
validDecimationValue_,
|
validDecimationValue_,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
validIndices.get());
|
validIndices.get(),
|
||||||
|
parameters_);
|
||||||
|
|
||||||
if(voxelSpin_->value())
|
if(voxelSpin_->value())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -237,6 +237,11 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
{
|
{
|
||||||
_ui->comboBox_cameraStereo->setItemData(1, 0, Qt::UserRole - 1);
|
_ui->comboBox_cameraStereo->setItemData(1, 0, Qt::UserRole - 1);
|
||||||
}
|
}
|
||||||
|
if (!CameraStereoZed::available())
|
||||||
|
{
|
||||||
|
_ui->comboBox_cameraRGBD->setItemData(7, 0, Qt::UserRole - 1);
|
||||||
|
_ui->comboBox_cameraStereo->setItemData(4, 0, Qt::UserRole - 1);
|
||||||
|
}
|
||||||
_ui->openni2_exposure->setEnabled(CameraOpenNI2::exposureGainAvailable());
|
_ui->openni2_exposure->setEnabled(CameraOpenNI2::exposureGainAvailable());
|
||||||
_ui->openni2_gain->setEnabled(CameraOpenNI2::exposureGainAvailable());
|
_ui->openni2_gain->setEnabled(CameraOpenNI2::exposureGainAvailable());
|
||||||
|
|
||||||
@@ -466,6 +471,8 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
connect(_ui->lineEdit_cameraStereoVideo_path, SIGNAL(textChanged(const QString &)), this, SLOT(makeObsoleteSourcePanel()));
|
connect(_ui->lineEdit_cameraStereoVideo_path, SIGNAL(textChanged(const QString &)), this, SLOT(makeObsoleteSourcePanel()));
|
||||||
connect(_ui->checkBox_stereoVideo_rectify, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
connect(_ui->checkBox_stereoVideo_rectify, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
||||||
|
|
||||||
|
connect(_ui->checkBox_stereoZed_computeDisparity, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
||||||
|
|
||||||
connect(_ui->checkbox_rgbd_colorOnly, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
connect(_ui->checkbox_rgbd_colorOnly, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
||||||
connect(_ui->spinBox_source_imageDecimation, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
connect(_ui->spinBox_source_imageDecimation, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
||||||
connect(_ui->checkbox_stereo_depthGenerated, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
connect(_ui->checkbox_stereo_depthGenerated, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
|
||||||
@@ -1271,6 +1278,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
|
|||||||
_ui->checkBox_stereoImages_rectify->setChecked(false);
|
_ui->checkBox_stereoImages_rectify->setChecked(false);
|
||||||
_ui->lineEdit_cameraStereoVideo_path->setText("");
|
_ui->lineEdit_cameraStereoVideo_path->setText("");
|
||||||
_ui->checkBox_stereoVideo_rectify->setChecked(false);
|
_ui->checkBox_stereoVideo_rectify->setChecked(false);
|
||||||
|
_ui->checkBox_stereoZed_computeDisparity->setChecked(true);
|
||||||
|
|
||||||
_ui->checkBox_cameraImages_timestamps->setChecked(false);
|
_ui->checkBox_cameraImages_timestamps->setChecked(false);
|
||||||
_ui->checkBox_cameraImages_syncTimeStamps->setChecked(true);
|
_ui->checkBox_cameraImages_syncTimeStamps->setChecked(true);
|
||||||
@@ -1595,6 +1603,11 @@ void PreferencesDialog::readCameraSettings(const QString & filePath)
|
|||||||
_ui->checkBox_stereoVideo_rectify->setChecked(settings.value("rectify",_ui->checkBox_stereoVideo_rectify->isChecked()).toBool());
|
_ui->checkBox_stereoVideo_rectify->setChecked(settings.value("rectify",_ui->checkBox_stereoVideo_rectify->isChecked()).toBool());
|
||||||
settings.endGroup(); // StereoVideo
|
settings.endGroup(); // StereoVideo
|
||||||
|
|
||||||
|
settings.beginGroup("StereoZed");
|
||||||
|
_ui->checkBox_stereoZed_computeDisparity->setChecked(settings.value("compute_disp", _ui->checkBox_stereoZed_computeDisparity->isChecked()).toBool());
|
||||||
|
settings.endGroup(); // StereoZed
|
||||||
|
|
||||||
|
|
||||||
settings.beginGroup("Images");
|
settings.beginGroup("Images");
|
||||||
_ui->source_images_lineEdit_path->setText(settings.value("path", _ui->source_images_lineEdit_path->text()).toString());
|
_ui->source_images_lineEdit_path->setText(settings.value("path", _ui->source_images_lineEdit_path->text()).toString());
|
||||||
_ui->source_images_spinBox_startPos->setValue(settings.value("startPos",_ui->source_images_spinBox_startPos->value()).toInt());
|
_ui->source_images_spinBox_startPos->setValue(settings.value("startPos",_ui->source_images_spinBox_startPos->value()).toInt());
|
||||||
@@ -1979,6 +1992,12 @@ void PreferencesDialog::writeCameraSettings(const QString & filePath) const
|
|||||||
settings.setValue("rectify", _ui->checkBox_stereoVideo_rectify->isChecked());
|
settings.setValue("rectify", _ui->checkBox_stereoVideo_rectify->isChecked());
|
||||||
settings.endGroup(); // StereoVideo
|
settings.endGroup(); // StereoVideo
|
||||||
|
|
||||||
|
settings.beginGroup("StereoZed");
|
||||||
|
settings.setValue("compute_disp", _ui->checkBox_stereoZed_computeDisparity->isChecked());
|
||||||
|
settings.endGroup(); // StereoZed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
settings.beginGroup("Images");
|
settings.beginGroup("Images");
|
||||||
settings.setValue("path", _ui->source_images_lineEdit_path->text());
|
settings.setValue("path", _ui->source_images_lineEdit_path->text());
|
||||||
settings.setValue("startPos", _ui->source_images_spinBox_startPos->value());
|
settings.setValue("startPos", _ui->source_images_spinBox_startPos->value());
|
||||||
@@ -2556,17 +2575,16 @@ void PreferencesDialog::selectSourceDriver(Src src)
|
|||||||
else if(src >= kSrcStereo && src<kSrcRGB)
|
else if(src >= kSrcStereo && src<kSrcRGB)
|
||||||
{
|
{
|
||||||
_ui->comboBox_sourceType->setCurrentIndex(1);
|
_ui->comboBox_sourceType->setCurrentIndex(1);
|
||||||
_ui->comboBox_cameraRGBD->setCurrentIndex(src - kSrcStereo);
|
_ui->comboBox_cameraStereo->setCurrentIndex(src - kSrcStereo);
|
||||||
}
|
}
|
||||||
else if(src >= kSrcRGB && src<kSrcDatabase)
|
else if(src >= kSrcRGB && src<kSrcDatabase)
|
||||||
{
|
{
|
||||||
_ui->comboBox_sourceType->setCurrentIndex(2);
|
_ui->comboBox_sourceType->setCurrentIndex(2);
|
||||||
_ui->comboBox_cameraRGBD->setCurrentIndex(src - kSrcRGB);
|
_ui->source_comboBox_image_type->setCurrentIndex(src - kSrcRGB);
|
||||||
}
|
}
|
||||||
else if(src >= kSrcDatabase)
|
else if(src >= kSrcDatabase)
|
||||||
{
|
{
|
||||||
_ui->comboBox_sourceType->setCurrentIndex(3);
|
_ui->comboBox_sourceType->setCurrentIndex(3);
|
||||||
_ui->comboBox_cameraRGBD->setCurrentIndex(src - kSrcDatabase);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(validateForm())
|
if(validateForm())
|
||||||
@@ -3427,8 +3445,13 @@ void PreferencesDialog::updateSourceGrpVisibility()
|
|||||||
_ui->groupBox_cameraRGBDImages->setVisible(_ui->comboBox_sourceType->currentIndex() == 0 && _ui->comboBox_cameraRGBD->currentIndex() == kSrcRGBDImages-kSrcRGBD);
|
_ui->groupBox_cameraRGBDImages->setVisible(_ui->comboBox_sourceType->currentIndex() == 0 && _ui->comboBox_cameraRGBD->currentIndex() == kSrcRGBDImages-kSrcRGBD);
|
||||||
_ui->groupBox_openni->setVisible(_ui->comboBox_sourceType->currentIndex() == 0 && _ui->comboBox_cameraRGBD->currentIndex() == kSrcOpenNI_PCL-kSrcRGBD);
|
_ui->groupBox_openni->setVisible(_ui->comboBox_sourceType->currentIndex() == 0 && _ui->comboBox_cameraRGBD->currentIndex() == kSrcOpenNI_PCL-kSrcRGBD);
|
||||||
|
|
||||||
_ui->stackedWidget_stereo->setVisible(_ui->comboBox_sourceType->currentIndex() == 1 && (_ui->comboBox_cameraStereo->currentIndex() == kSrcStereoVideo-kSrcStereo || _ui->comboBox_cameraStereo->currentIndex() == kSrcStereoImages-kSrcStereo));
|
_ui->stackedWidget_stereo->setVisible(_ui->comboBox_sourceType->currentIndex() == 1 &&
|
||||||
|
(_ui->comboBox_cameraStereo->currentIndex() == kSrcStereoVideo-kSrcStereo ||
|
||||||
|
_ui->comboBox_cameraStereo->currentIndex() == kSrcStereoImages-kSrcStereo ||
|
||||||
|
_ui->comboBox_cameraStereo->currentIndex() == kSrcStereoZed - kSrcStereo));
|
||||||
_ui->groupBox_cameraStereoImages->setVisible(_ui->comboBox_sourceType->currentIndex() == 1 && _ui->comboBox_cameraStereo->currentIndex() == kSrcStereoImages-kSrcStereo);
|
_ui->groupBox_cameraStereoImages->setVisible(_ui->comboBox_sourceType->currentIndex() == 1 && _ui->comboBox_cameraStereo->currentIndex() == kSrcStereoImages-kSrcStereo);
|
||||||
|
_ui->groupBox_cameraStereoVideo->setVisible(_ui->comboBox_sourceType->currentIndex() == 1 && _ui->comboBox_cameraStereo->currentIndex() == kSrcStereoVideo - kSrcStereo);
|
||||||
|
_ui->groupBox_cameraStereoZed->setVisible(_ui->comboBox_sourceType->currentIndex() == 1 && _ui->comboBox_cameraStereo->currentIndex() == kSrcStereoZed - kSrcStereo);
|
||||||
|
|
||||||
_ui->stackedWidget_image->setVisible(_ui->comboBox_sourceType->currentIndex() == 2 && (_ui->source_comboBox_image_type->currentIndex() == kSrcImages-kSrcRGB || _ui->source_comboBox_image_type->currentIndex() == kSrcVideo-kSrcRGB));
|
_ui->stackedWidget_image->setVisible(_ui->comboBox_sourceType->currentIndex() == 2 && (_ui->source_comboBox_image_type->currentIndex() == kSrcImages-kSrcRGB || _ui->source_comboBox_image_type->currentIndex() == kSrcVideo-kSrcRGB));
|
||||||
_ui->source_groupBox_images->setVisible(_ui->comboBox_sourceType->currentIndex() == 2 && _ui->source_comboBox_image_type->currentIndex() == kSrcImages-kSrcRGB);
|
_ui->source_groupBox_images->setVisible(_ui->comboBox_sourceType->currentIndex() == 2 && _ui->source_comboBox_image_type->currentIndex() == kSrcImages-kSrcRGB);
|
||||||
@@ -3948,6 +3971,13 @@ Camera * PreferencesDialog::createCamera(bool useRawImages)
|
|||||||
_ui->lineEdit_cameraImages_timestamps->text().toStdString(),
|
_ui->lineEdit_cameraImages_timestamps->text().toStdString(),
|
||||||
_ui->checkBox_cameraImages_syncTimeStamps->isChecked());
|
_ui->checkBox_cameraImages_syncTimeStamps->isChecked());
|
||||||
}
|
}
|
||||||
|
else if (driver == kSrcStereoUsb)
|
||||||
|
{
|
||||||
|
camera = new CameraStereoVideo(
|
||||||
|
this->getSourceDevice().isEmpty() ? 0 : atoi(this->getSourceDevice().toStdString().c_str()),
|
||||||
|
this->getGeneralInputRate(),
|
||||||
|
this->getSourceLocalTransform());
|
||||||
|
}
|
||||||
else if(driver == kSrcStereoVideo)
|
else if(driver == kSrcStereoVideo)
|
||||||
{
|
{
|
||||||
camera = new CameraStereoVideo(
|
camera = new CameraStereoVideo(
|
||||||
@@ -3956,6 +3986,13 @@ Camera * PreferencesDialog::createCamera(bool useRawImages)
|
|||||||
this->getGeneralInputRate(),
|
this->getGeneralInputRate(),
|
||||||
this->getSourceLocalTransform());
|
this->getSourceLocalTransform());
|
||||||
}
|
}
|
||||||
|
else if (driver == kSrcStereoZed)
|
||||||
|
{
|
||||||
|
camera = new CameraStereoZed(
|
||||||
|
_ui->checkBox_stereoZed_computeDisparity->isChecked(),
|
||||||
|
this->getGeneralInputRate(),
|
||||||
|
this->getSourceLocalTransform());
|
||||||
|
}
|
||||||
else if(driver == kSrcUsbDevice)
|
else if(driver == kSrcUsbDevice)
|
||||||
{
|
{
|
||||||
camera = new CameraVideo(
|
camera = new CameraVideo(
|
||||||
@@ -4219,7 +4256,8 @@ void PreferencesDialog::testOdometry()
|
|||||||
0.0f,
|
0.0f,
|
||||||
_ui->doubleSpinBox_maxDepth_odom->value(),
|
_ui->doubleSpinBox_maxDepth_odom->value(),
|
||||||
this->getOdomQualityWarnThr(),
|
this->getOdomQualityWarnThr(),
|
||||||
this);
|
this,
|
||||||
|
this->getAllParameters());
|
||||||
odomViewer->setWindowTitle(tr("Odometry viewer"));
|
odomViewer->setWindowTitle(tr("Odometry viewer"));
|
||||||
odomViewer->resize(1280, 480+QPushButton().minimumHeight());
|
odomViewer->resize(1280, 480+QPushButton().minimumHeight());
|
||||||
odomViewer->registerToEventsManager();
|
odomViewer->registerToEventsManager();
|
||||||
@@ -4269,7 +4307,7 @@ void PreferencesDialog::testOdometry()
|
|||||||
|
|
||||||
void PreferencesDialog::testCamera()
|
void PreferencesDialog::testCamera()
|
||||||
{
|
{
|
||||||
CameraViewer * window = new CameraViewer(this);
|
CameraViewer * window = new CameraViewer(this, this->getAllParameters());
|
||||||
window->setWindowTitle(tr("Camera viewer"));
|
window->setWindowTitle(tr("Camera viewer"));
|
||||||
window->resize(1280, 480+QPushButton().minimumHeight());
|
window->resize(1280, 480+QPushButton().minimumHeight());
|
||||||
window->registerToEventsManager();
|
window->registerToEventsManager();
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
@@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1012</width>
|
<width>1012</width>
|
||||||
<height>711</height>
|
<height>712</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1012</width>
|
<width>1012</width>
|
||||||
<height>25</height>
|
<height>21</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
@@ -190,7 +190,19 @@
|
|||||||
<addaction name="actionStereoDC1394"/>
|
<addaction name="actionStereoDC1394"/>
|
||||||
<addaction name="actionStereoFlyCapture2"/>
|
<addaction name="actionStereoFlyCapture2"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QMenu" name="menuZed_camera">
|
||||||
|
<property name="title">
|
||||||
|
<string>Zed camera</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="../GuiLib.qrc">
|
||||||
|
<normaloff>:/images/zed.png</normaloff>:/images/zed.png</iconset>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionStereoZed"/>
|
||||||
|
<addaction name="actionStereoUsb"/>
|
||||||
|
</widget>
|
||||||
<addaction name="menuBumblebee2_2"/>
|
<addaction name="menuBumblebee2_2"/>
|
||||||
|
<addaction name="menuZed_camera"/>
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menuRGB_D_camera"/>
|
<addaction name="menuRGB_D_camera"/>
|
||||||
<addaction name="menuStereo_camera"/>
|
<addaction name="menuStereo_camera"/>
|
||||||
@@ -1325,7 +1337,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>More options...</string>
|
<string>More Options...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionLabel_current_location">
|
<action name="actionLabel_current_location">
|
||||||
@@ -1391,6 +1403,22 @@
|
|||||||
<string>Anchor clouds to ground truth</string>
|
<string>Anchor clouds to ground truth</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionStereoZed">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Zed sdk</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionStereoUsb">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Stereo Usb Camera</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
|
|||||||
@@ -64,15 +64,24 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>686</width>
|
<width>685</width>
|
||||||
<height>2023</height>
|
<height>1826</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -86,7 +95,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>11</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
||||||
@@ -2006,7 +2015,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QStackedWidget" name="stackedWidget_src">
|
<widget class="QStackedWidget" name="stackedWidget_src">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>3</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_41">
|
<widget class="QWidget" name="page_41">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_64">
|
<layout class="QVBoxLayout" name="verticalLayout_64">
|
||||||
@@ -2182,7 +2191,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>306</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
@@ -2199,7 +2208,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>306</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
@@ -2216,7 +2225,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>306</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
@@ -2730,7 +2739,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_46">
|
<widget class="QLabel" name="label_46">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Grabber for stereo devices (i.e., Bumblebee2).</string>
|
<string>Grabber for stereo devices (i.e., Bumblebee2, Zed camera).</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -2764,6 +2773,16 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<string>Video (Side-by-Side)</string>
|
<string>Video (Side-by-Side)</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>ZED sdk</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Usb camera (Side-by-Side)</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="2">
|
<item row="0" column="2">
|
||||||
@@ -2798,7 +2817,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QStackedWidget" name="stackedWidget_stereo">
|
<widget class="QStackedWidget" name="stackedWidget_stereo">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>3</number>
|
<number>5</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_49">
|
<widget class="QWidget" name="page_49">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_91">
|
<layout class="QVBoxLayout" name="verticalLayout_91">
|
||||||
@@ -2810,7 +2829,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>306</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
@@ -2827,7 +2846,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>306</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
@@ -2943,7 +2962,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<widget class="QWidget" name="page_50">
|
<widget class="QWidget" name="page_50">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_78">
|
<layout class="QVBoxLayout" name="verticalLayout_78">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_cameraStereoImages_2">
|
<widget class="QGroupBox" name="groupBox_cameraStereoVideo">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
@@ -3006,6 +3025,79 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_59">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_101">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_cameraStereoZed">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Zed sdk</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_102">
|
||||||
|
<item>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_37" columnstretch="0,1">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_stereoZed_computeDisparity">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_272">
|
||||||
|
<property name="text">
|
||||||
|
<string>Compute disparity with the GPU (using Zed sdk approach). Note that "Generate disparity image..." above will be ignored if set.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_54">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_60">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_103">
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_53">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>217</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
@@ -3069,7 +3161,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QStackedWidget" name="stackedWidget_image">
|
<widget class="QStackedWidget" name="stackedWidget_image">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_7">
|
<widget class="QWidget" name="page_7">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_30">
|
<layout class="QVBoxLayout" name="verticalLayout_30">
|
||||||
@@ -3422,7 +3514,16 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<string>Directory of images (optional settings)</string>
|
<string>Directory of images (optional settings)</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_93">
|
<layout class="QVBoxLayout" name="verticalLayout_93">
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -8579,7 +8680,16 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_54">
|
<widget class="QWidget" name="page_54">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_85">
|
<layout class="QVBoxLayout" name="verticalLayout_85">
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -8719,7 +8829,16 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="page_55">
|
<widget class="QWidget" name="page_55">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_86">
|
<layout class="QVBoxLayout" name="verticalLayout_86">
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -8877,7 +8996,16 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -8957,7 +9085,16 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -9069,7 +9206,16 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ void showUsage()
|
|||||||
" 5=Freenect2 (Kinect v2)\n"
|
" 5=Freenect2 (Kinect v2)\n"
|
||||||
" 6=DC1394 (Bumblebee2)\n"
|
" 6=DC1394 (Bumblebee2)\n"
|
||||||
" 7=FlyCapture2 (Bumblebee2)\n"
|
" 7=FlyCapture2 (Bumblebee2)\n"
|
||||||
|
" 8=ZED stereo\n"
|
||||||
" Options:\n"
|
" Options:\n"
|
||||||
" -rate #.# Input rate Hz (default 0=inf)\n"
|
" -rate #.# Input rate Hz (default 0=inf)\n"
|
||||||
" -save_stereo \"path\" Save stereo images in a folder or a video file (side by side *.avi).\n"
|
" -save_stereo \"path\" Save stereo images in a folder or a video file (side by side *.avi).\n"
|
||||||
@@ -149,9 +150,9 @@ int main(int argc, char * argv[])
|
|||||||
|
|
||||||
// last
|
// last
|
||||||
driver = atoi(argv[i]);
|
driver = atoi(argv[i]);
|
||||||
if(driver < 0 || driver > 7)
|
if(driver < 0 || driver > 8)
|
||||||
{
|
{
|
||||||
UERROR("driver should be between 0 and 6.");
|
UERROR("driver should be between 0 and 8.");
|
||||||
showUsage();
|
showUsage();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -235,6 +236,15 @@ int main(int argc, char * argv[])
|
|||||||
}
|
}
|
||||||
camera = new rtabmap::CameraStereoFlyCapture2();
|
camera = new rtabmap::CameraStereoFlyCapture2();
|
||||||
}
|
}
|
||||||
|
else if(driver == 8)
|
||||||
|
{
|
||||||
|
if(!rtabmap::CameraStereoZed::available())
|
||||||
|
{
|
||||||
|
UERROR("Not built with ZED sdk support...");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
camera = new rtabmap::CameraStereoZed(true);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UFATAL("");
|
UFATAL("");
|
||||||
|
|||||||
Reference in New Issue
Block a user