You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.2 KiB
C++

/**
* @file labeledPlane3d.h
*
* @auhtor Remus Claudiu Dumitru <r.dumitru@jacobs-university.de>
* @date 15 Apr 2012
*
*/
#ifndef LABELEDPLANE3D_H_
#define LABELEDPLANE3D_H_
//==============================================================================
// Includes
//==============================================================================
#include "model/plane3d.h"
#include "model/candidateOpening.h"
#include "model/commonTypes.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <vector>
//==============================================================================
// Global Variables
//==============================================================================
extern bool quiet;
//==============================================================================
// Class Declarations
//==============================================================================
namespace model {
/**
* The three possible labels on a wall, as a result of the raytracing algorithm.
*/
enum Label {
EMPTY, OCCUPIED, OCCLUDED, OPENING, UNKOWN
};
/**
* A class representing a plane that has additional features such as labeling of patches.
*/
class LabeledPlane3d : public Plane3d {
private:
static const std::string RED;
static const std::string GREEN;
static const std::string BLUE;
static const std::string WHITE;
static const double LINE_EPSILON; //!< An epislon value to decide whether a line is horizontal or vertical.
static const double SOBEL_SCALE; //!< To be used when applying Sobel to any image.
static const double SOBEL_DELTA; //!< To be used when applying Sobel to any image.
static const int SOBEL_KERNEL; //!< To be used when applying Sobel to any image.
static const double CANNY_THRESH1; //!< The lower threshold for Canny.
static const double CANNY_THRESH2; //!< The upper threshold for Canny.
static const double HOUGH_RHO; //!< Rho used in the Hough transform.
static const double HOUGH_THETA; //!< Theta used in the Hough transform.
static const int HOUGH_THRESH; //!< Hough transform threshold.
static const double HOUGH_MIN_LINE_LEN; //!< Minimum line length for Hough transform.
static const double MIN_EMPTY_AREA; //!< Minimum empty area percentage.
static const double MIN_TOTAL_AREA; //!< Minimum total area percentage of wall.
static const double MAX_TOTAL_AREA; //!< Maximum total area percentage of wall.
private:
std::string name;
public:
/**
* Each discrete patch is described in this matrix.
*/
std::vector<std::vector<std::pair<model::Point3d, Label> > > patches;
/**
* Remember a depth map of the plane to be used when detecting the windows.
* To be built in the same time when applying labels.
*/
std::vector<std::vector<double> > depthMap;
/**
* The OpenCV image of the depthMap.
*/
cv::Mat depthImg;
/**
* The corrected depth image of the wall;
*/
cv::Mat correctedDepthImg;
/**
* The wall distance and the maximum distance (2 * wall distance + ray distance)
* at which the depth map was computed.
*/
std::pair<double, double> depthMapDistances;
// constructores and destructors
LabeledPlane3d();
LabeledPlane3d(const Point3d& pt, const Vector3d& normal);
LabeledPlane3d(const Point3d& pt, const Vector3d& normal, const std::vector<Point3d>& hull);
LabeledPlane3d(const LabeledPlane3d& other);
virtual ~LabeledPlane3d();
// operators
LabeledPlane3d& operator=(const LabeledPlane3d& other);
/**
* Computes the Canny for this wall using the depth image.
*/
void detectEdges(cv::Mat& img, cv::Mat& hImg, cv::Mat& vImg, cv::Mat& combined) const;
/**
* Computes the horizontal and vertical lines.
*/
void computeLines(std::vector<int>& verticalResult, std::vector<int>& horizontalResult) const;
/**
* Returns all opening candidates.
*/
void computeOpeningCandidates(std::vector<CandidateOpening>& candidates) const;
};
} /* namespace model */
#endif /* LABELEDPLANE3D_H_ */