| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 | /*M///////////////////////////////////////////////////////////////////////////////////////////  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.////  By downloading, copying, installing or using the software you agree to this license.//  If you do not agree to this license, do not download, install,//  copy or use the software.//////                          License Agreement//                For Open Source Computer Vision Library//// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.// Copyright (C) 2009, Willow Garage Inc., all rights reserved.// Copyright (C) 2013, OpenCV Foundation, all rights reserved.// Third party copyrights are property of their respective owners.//// Redistribution and use in source and binary forms, with or without modification,// are permitted provided that the following conditions are met:////   * Redistribution's of source code must retain the above copyright notice,//     this list of conditions and the following disclaimer.////   * Redistribution's in binary form must reproduce the above copyright notice,//     this list of conditions and the following disclaimer in the documentation//     and/or other materials provided with the distribution.////   * The name of the copyright holders may not be used to endorse or promote products//     derived from this software without specific prior written permission.//// This software is provided by the copyright holders and contributors "as is" and// any express or implied warranties, including, but not limited to, the implied// warranties of merchantability and fitness for a particular purpose are disclaimed.// In no event shall the Intel Corporation or contributors be liable for any direct,// indirect, incidental, special, exemplary, or consequential damages// (including, but not limited to, procurement of substitute goods or services;// loss of use, data, or profits; or business interruption) however caused// and on any theory of liability, whether in contract, strict liability,// or tort (including negligence or otherwise) arising in any way out of// the use of this software, even if advised of the possibility of such damage.////M*/#ifndef __OPENCV_OBJDETECT_LINEMOD_HPP__#define __OPENCV_OBJDETECT_LINEMOD_HPP__#include "opencv2/core.hpp"#include <map>/****************************************************************************************\*                                 LINE-MOD                                               *\****************************************************************************************/namespace cv {namespace linemod {//! @addtogroup rgbd//! @{/** * \brief Discriminant feature described by its location and label. */struct CV_EXPORTS_W_SIMPLE Feature{  CV_PROP_RW int x; ///< x offset  CV_PROP_RW int y; ///< y offset  CV_PROP_RW int label; ///< Quantization  CV_WRAP Feature() : x(0), y(0), label(0) {}  CV_WRAP Feature(int x, int y, int label);  void read(const FileNode& fn);  void write(FileStorage& fs) const;};inline Feature::Feature(int _x, int _y, int _label) : x(_x), y(_y), label(_label) {}struct CV_EXPORTS_W_SIMPLE Template{  CV_PROP int width;  CV_PROP int height;  CV_PROP int pyramid_level;  std::vector<Feature> features; // FIXIT: CV_PROP  void read(const FileNode& fn);  void write(FileStorage& fs) const;};/** * \brief Represents a modality operating over an image pyramid. */class CV_EXPORTS_W QuantizedPyramid{public:  // Virtual destructor  virtual ~QuantizedPyramid() {}  /**   * \brief Compute quantized image at current pyramid level for online detection.   *   * \param[out] dst The destination 8-bit image. For each pixel at most one bit is set,   *                 representing its classification.   */  CV_WRAP virtual void quantize(CV_OUT Mat& dst) const =0;  /**   * \brief Extract most discriminant features at current pyramid level to form a new template.   *   * \param[out] templ The new template.   */  CV_WRAP virtual bool extractTemplate(CV_OUT Template& templ) const =0;  /**   * \brief Go to the next pyramid level.   *   * \todo Allow pyramid scale factor other than 2   */  CV_WRAP virtual void pyrDown() =0;protected:  /// Candidate feature with a score  struct Candidate  {    Candidate(int x, int y, int label, float score);    /// Sort candidates with high score to the front    bool operator<(const Candidate& rhs) const    {      return score > rhs.score;    }    Feature f;    float score;  };  /**   * \brief Choose candidate features so that they are not bunched together.   *   * \param[in]  candidates   Candidate features sorted by score.   * \param[out] features     Destination vector of selected features.   * \param[in]  num_features Number of candidates to select.   * \param[in]  distance     Hint for desired distance between features.   */  static void selectScatteredFeatures(const std::vector<Candidate>& candidates,                                      std::vector<Feature>& features,                                      size_t num_features, float distance);};inline QuantizedPyramid::Candidate::Candidate(int x, int y, int label, float _score) : f(x, y, label), score(_score) {}/** * \brief Interface for modalities that plug into the LINE template matching representation. * * \todo Max response, to allow optimization of summing (255/MAX) features as uint8 */class CV_EXPORTS_W Modality{public:  // Virtual destructor  virtual ~Modality() {}  /**   * \brief Form a quantized image pyramid from a source image.   *   * \param[in] src  The source image. Type depends on the modality.   * \param[in] mask Optional mask. If not empty, unmasked pixels are set to zero   *                 in quantized image and cannot be extracted as features.   */  CV_WRAP Ptr<QuantizedPyramid> process(const Mat& src,                    const Mat& mask = Mat()) const  {    return processImpl(src, mask);  }  CV_WRAP virtual String name() const =0;  CV_WRAP virtual void read(const FileNode& fn) =0;  virtual void write(FileStorage& fs) const =0;  /**   * \brief Create modality by name.   *   * The following modality types are supported:   * - "ColorGradient"   * - "DepthNormal"   */  CV_WRAP static Ptr<Modality> create(const String& modality_type);  /**   * \brief Load a modality from file.   */  CV_WRAP static Ptr<Modality> create(const FileNode& fn);protected:  // Indirection is because process() has a default parameter.  virtual Ptr<QuantizedPyramid> processImpl(const Mat& src,                        const Mat& mask) const =0;};/** * \brief Modality that computes quantized gradient orientations from a color image. */class CV_EXPORTS ColorGradient : public Modality{public:  /**   * \brief Default constructor. Uses reasonable default parameter values.   */  ColorGradient();  /**   * \brief Constructor.   *   * \param weak_threshold   When quantizing, discard gradients with magnitude less than this.   * \param num_features     How many features a template must contain.   * \param strong_threshold Consider as candidate features only gradients whose norms are   *                         larger than this.   */  ColorGradient(float weak_threshold, size_t num_features, float strong_threshold);  virtual String name() const;  virtual void read(const FileNode& fn);  virtual void write(FileStorage& fs) const;  float weak_threshold;  size_t num_features;  float strong_threshold;protected:  virtual Ptr<QuantizedPyramid> processImpl(const Mat& src,                        const Mat& mask) const;};/** * \brief Modality that computes quantized surface normals from a dense depth map. */class CV_EXPORTS DepthNormal : public Modality{public:  /**   * \brief Default constructor. Uses reasonable default parameter values.   */  DepthNormal();  /**   * \brief Constructor.   *   * \param distance_threshold   Ignore pixels beyond this distance.   * \param difference_threshold When computing normals, ignore contributions of pixels whose   *                             depth difference with the central pixel is above this threshold.   * \param num_features         How many features a template must contain.   * \param extract_threshold    Consider as candidate feature only if there are no differing   *                             orientations within a distance of extract_threshold.   */  DepthNormal(int distance_threshold, int difference_threshold, size_t num_features,              int extract_threshold);  virtual String name() const;  virtual void read(const FileNode& fn);  virtual void write(FileStorage& fs) const;  int distance_threshold;  int difference_threshold;  size_t num_features;  int extract_threshold;protected:  virtual Ptr<QuantizedPyramid> processImpl(const Mat& src,                        const Mat& mask) const;};/** * \brief Debug function to colormap a quantized image for viewing. */CV_EXPORTS_W void colormap(const Mat& quantized, CV_OUT Mat& dst);/** * \brief Represents a successful template match. */struct CV_EXPORTS_W_SIMPLE Match{  CV_WRAP Match()  {  }  CV_WRAP Match(int x, int y, float similarity, const String& class_id, int template_id);  /// Sort matches with high similarity to the front  bool operator<(const Match& rhs) const  {    // Secondarily sort on template_id for the sake of duplicate removal    if (similarity != rhs.similarity)      return similarity > rhs.similarity;    else      return template_id < rhs.template_id;  }  bool operator==(const Match& rhs) const  {    return x == rhs.x && y == rhs.y && similarity == rhs.similarity && class_id == rhs.class_id;  }  CV_PROP_RW int x;  CV_PROP_RW int y;  CV_PROP_RW float similarity;  CV_PROP_RW String class_id;  CV_PROP_RW int template_id;};inlineMatch::Match(int _x, int _y, float _similarity, const String& _class_id, int _template_id)    : x(_x), y(_y), similarity(_similarity), class_id(_class_id), template_id(_template_id){}/** * \brief Object detector using the LINE template matching algorithm with any set of * modalities. */class CV_EXPORTS_W Detector{public:  /**   * \brief Empty constructor, initialize with read().   */  CV_WRAP Detector();  /**   * \brief Constructor.   *   * \param modalities       Modalities to use (color gradients, depth normals, ...).   * \param T_pyramid        Value of the sampling step T at each pyramid level. The   *                         number of pyramid levels is T_pyramid.size().   */  CV_WRAP Detector(const std::vector< Ptr<Modality> >& modalities, const std::vector<int>& T_pyramid);  /**   * \brief Detect objects by template matching.   *   * Matches globally at the lowest pyramid level, then refines locally stepping up the pyramid.   *   * \param      sources   Source images, one for each modality.   * \param      threshold Similarity threshold, a percentage between 0 and 100.   * \param[out] matches   Template matches, sorted by similarity score.   * \param      class_ids If non-empty, only search for the desired object classes.   * \param[out] quantized_images Optionally return vector<Mat> of quantized images.   * \param      masks     The masks for consideration during matching. The masks should be CV_8UC1   *                       where 255 represents a valid pixel.  If non-empty, the vector must be   *                       the same size as sources.  Each element must be   *                       empty or the same size as its corresponding source.   */  CV_WRAP void match(const std::vector<Mat>& sources, float threshold, CV_OUT std::vector<Match>& matches,             const std::vector<String>& class_ids = std::vector<String>(),             OutputArrayOfArrays quantized_images = noArray(),             const std::vector<Mat>& masks = std::vector<Mat>()) const;  /**   * \brief Add new object template.   *   * \param      sources      Source images, one for each modality.   * \param      class_id     Object class ID.   * \param      object_mask  Mask separating object from background.   * \param[out] bounding_box Optionally return bounding box of the extracted features.   *   * \return Template ID, or -1 if failed to extract a valid template.   */  CV_WRAP int addTemplate(const std::vector<Mat>& sources, const String& class_id,          const Mat& object_mask, CV_OUT Rect* bounding_box = NULL);  /**   * \brief Add a new object template computed by external means.   */  CV_WRAP int addSyntheticTemplate(const std::vector<Template>& templates, const String& class_id);  /**   * \brief Get the modalities used by this detector.   *   * You are not permitted to add/remove modalities, but you may dynamic_cast them to   * tweak parameters.   */  CV_WRAP const std::vector< Ptr<Modality> >& getModalities() const { return modalities; }  /**   * \brief Get sampling step T at pyramid_level.   */  CV_WRAP int getT(int pyramid_level) const { return T_at_level[pyramid_level]; }  /**   * \brief Get number of pyramid levels used by this detector.   */  CV_WRAP int pyramidLevels() const { return pyramid_levels; }  /**   * \brief Get the template pyramid identified by template_id.   *   * For example, with 2 modalities (Gradient, Normal) and two pyramid levels   * (L0, L1), the order is (GradientL0, NormalL0, GradientL1, NormalL1).   */  CV_WRAP const std::vector<Template>& getTemplates(const String& class_id, int template_id) const;  CV_WRAP int numTemplates() const;  CV_WRAP int numTemplates(const String& class_id) const;  CV_WRAP int numClasses() const { return static_cast<int>(class_templates.size()); }  CV_WRAP std::vector<String> classIds() const;  CV_WRAP void read(const FileNode& fn);  void write(FileStorage& fs) const;  String readClass(const FileNode& fn, const String &class_id_override = "");  void writeClass(const String& class_id, FileStorage& fs) const;  CV_WRAP void readClasses(const std::vector<String>& class_ids,                   const String& format = "templates_%s.yml.gz");  CV_WRAP void writeClasses(const String& format = "templates_%s.yml.gz") const;protected:  std::vector< Ptr<Modality> > modalities;  int pyramid_levels;  std::vector<int> T_at_level;  typedef std::vector<Template> TemplatePyramid;  typedef std::map<String, std::vector<TemplatePyramid> > TemplatesMap;  TemplatesMap class_templates;  typedef std::vector<Mat> LinearMemories;  // Indexed as [pyramid level][modality][quantized label]  typedef std::vector< std::vector<LinearMemories> > LinearMemoryPyramid;  void matchClass(const LinearMemoryPyramid& lm_pyramid,                  const std::vector<Size>& sizes,                  float threshold, std::vector<Match>& matches,                  const String& class_id,                  const std::vector<TemplatePyramid>& template_pyramids) const;};/** * \brief Factory function for detector using LINE algorithm with color gradients. * * Default parameter settings suitable for VGA images. */CV_EXPORTS_W Ptr<linemod::Detector> getDefaultLINE();/** * \brief Factory function for detector using LINE-MOD algorithm with color gradients * and depth normals. * * Default parameter settings suitable for VGA images. */CV_EXPORTS_W Ptr<linemod::Detector> getDefaultLINEMOD();//! @}} // namespace linemod} // namespace cv#endif // __OPENCV_OBJDETECT_LINEMOD_HPP__
 |