github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/opencv4/include/opencv2/dnn/dnn.inl.hpp (about)

     1  /*M///////////////////////////////////////////////////////////////////////////////////////
     2  //
     3  //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
     4  //
     5  //  By downloading, copying, installing or using the software you agree to this license.
     6  //  If you do not agree to this license, do not download, install,
     7  //  copy or use the software.
     8  //
     9  //
    10  //                           License Agreement
    11  //                For Open Source Computer Vision Library
    12  //
    13  // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
    14  // Third party copyrights are property of their respective owners.
    15  //
    16  // Redistribution and use in source and binary forms, with or without modification,
    17  // are permitted provided that the following conditions are met:
    18  //
    19  //   * Redistribution's of source code must retain the above copyright notice,
    20  //     this list of conditions and the following disclaimer.
    21  //
    22  //   * Redistribution's in binary form must reproduce the above copyright notice,
    23  //     this list of conditions and the following disclaimer in the documentation
    24  //     and/or other materials provided with the distribution.
    25  //
    26  //   * The name of the copyright holders may not be used to endorse or promote products
    27  //     derived from this software without specific prior written permission.
    28  //
    29  // This software is provided by the copyright holders and contributors "as is" and
    30  // any express or implied warranties, including, but not limited to, the implied
    31  // warranties of merchantability and fitness for a particular purpose are disclaimed.
    32  // In no event shall the Intel Corporation or contributors be liable for any direct,
    33  // indirect, incidental, special, exemplary, or consequential damages
    34  // (including, but not limited to, procurement of substitute goods or services;
    35  // loss of use, data, or profits; or business interruption) however caused
    36  // and on any theory of liability, whether in contract, strict liability,
    37  // or tort (including negligence or otherwise) arising in any way out of
    38  // the use of this software, even if advised of the possibility of such damage.
    39  //
    40  //M*/
    41  
    42  #ifndef OPENCV_DNN_DNN_INL_HPP
    43  #define OPENCV_DNN_DNN_INL_HPP
    44  
    45  #include <opencv2/dnn.hpp>
    46  
    47  namespace cv {
    48  namespace dnn {
    49  CV__DNN_INLINE_NS_BEGIN
    50  
    51  template<typename TypeIter>
    52  DictValue DictValue::arrayInt(TypeIter begin, int size)
    53  {
    54      DictValue res(Param::INT, new AutoBuffer<int64, 1>(size));
    55      for (int j = 0; j < size; begin++, j++)
    56          (*res.pi)[j] = *begin;
    57      return res;
    58  }
    59  
    60  template<typename TypeIter>
    61  DictValue DictValue::arrayReal(TypeIter begin, int size)
    62  {
    63      DictValue res(Param::REAL, new AutoBuffer<double, 1>(size));
    64      for (int j = 0; j < size; begin++, j++)
    65          (*res.pd)[j] = *begin;
    66      return res;
    67  }
    68  
    69  template<typename TypeIter>
    70  DictValue DictValue::arrayString(TypeIter begin, int size)
    71  {
    72      DictValue res(Param::STRING, new AutoBuffer<String, 1>(size));
    73      for (int j = 0; j < size; begin++, j++)
    74          (*res.ps)[j] = *begin;
    75      return res;
    76  }
    77  
    78  template<>
    79  inline DictValue DictValue::get<DictValue>(int idx) const
    80  {
    81      CV_Assert(idx == -1);
    82      return *this;
    83  }
    84  
    85  template<>
    86  inline int64 DictValue::get<int64>(int idx) const
    87  {
    88      CV_Assert((idx == -1 && size() == 1) || (idx >= 0 && idx < size()));
    89      idx = (idx == -1) ? 0 : idx;
    90  
    91      if (type == Param::INT)
    92      {
    93          return (*pi)[idx];
    94      }
    95      else if (type == Param::REAL)
    96      {
    97          double doubleValue = (*pd)[idx];
    98  
    99          double fracpart, intpart;
   100          fracpart = std::modf(doubleValue, &intpart);
   101          CV_Assert(fracpart == 0.0);
   102  
   103          return (int64)doubleValue;
   104      }
   105      else if (type == Param::STRING)
   106      {
   107          return std::atoi((*ps)[idx].c_str());
   108      }
   109      else
   110      {
   111          CV_Assert(isInt() || isReal() || isString());
   112          return 0;
   113      }
   114  }
   115  
   116  template<>
   117  inline int DictValue::get<int>(int idx) const
   118  {
   119      return (int)get<int64>(idx);
   120  }
   121  
   122  inline int DictValue::getIntValue(int idx) const
   123  {
   124      return (int)get<int64>(idx);
   125  }
   126  
   127  template<>
   128  inline unsigned DictValue::get<unsigned>(int idx) const
   129  {
   130      return (unsigned)get<int64>(idx);
   131  }
   132  
   133  template<>
   134  inline bool DictValue::get<bool>(int idx) const
   135  {
   136      return (get<int64>(idx) != 0);
   137  }
   138  
   139  template<>
   140  inline double DictValue::get<double>(int idx) const
   141  {
   142      CV_Assert((idx == -1 && size() == 1) || (idx >= 0 && idx < size()));
   143      idx = (idx == -1) ? 0 : idx;
   144  
   145      if (type == Param::REAL)
   146      {
   147          return (*pd)[idx];
   148      }
   149      else if (type == Param::INT)
   150      {
   151          return (double)(*pi)[idx];
   152      }
   153      else if (type == Param::STRING)
   154      {
   155          return std::atof((*ps)[idx].c_str());
   156      }
   157      else
   158      {
   159          CV_Assert(isReal() || isInt() || isString());
   160          return 0;
   161      }
   162  }
   163  
   164  inline double DictValue::getRealValue(int idx) const
   165  {
   166      return get<double>(idx);
   167  }
   168  
   169  template<>
   170  inline float DictValue::get<float>(int idx) const
   171  {
   172      return (float)get<double>(idx);
   173  }
   174  
   175  template<>
   176  inline String DictValue::get<String>(int idx) const
   177  {
   178      CV_Assert(isString());
   179      CV_Assert((idx == -1 && ps->size() == 1) || (idx >= 0 && idx < (int)ps->size()));
   180      return (*ps)[(idx == -1) ? 0 : idx];
   181  }
   182  
   183  
   184  inline String DictValue::getStringValue(int idx) const
   185  {
   186      return get<String>(idx);
   187  }
   188  
   189  inline void DictValue::release()
   190  {
   191      switch (type)
   192      {
   193      case Param::INT:
   194          delete pi;
   195          break;
   196      case Param::STRING:
   197          delete ps;
   198          break;
   199      case Param::REAL:
   200          delete pd;
   201          break;
   202      case Param::BOOLEAN:
   203      case Param::MAT:
   204      case Param::MAT_VECTOR:
   205      case Param::ALGORITHM:
   206      case Param::FLOAT:
   207      case Param::UNSIGNED_INT:
   208      case Param::UINT64:
   209      case Param::UCHAR:
   210      case Param::SCALAR:
   211          break; // unhandled
   212      }
   213  }
   214  
   215  inline DictValue::~DictValue()
   216  {
   217      release();
   218  }
   219  
   220  inline DictValue & DictValue::operator=(const DictValue &r)
   221  {
   222      if (&r == this)
   223          return *this;
   224  
   225      if (r.type == Param::INT)
   226      {
   227          AutoBuffer<int64, 1> *tmp = new AutoBuffer<int64, 1>(*r.pi);
   228          release();
   229          pi = tmp;
   230      }
   231      else if (r.type == Param::STRING)
   232      {
   233          AutoBuffer<String, 1> *tmp = new AutoBuffer<String, 1>(*r.ps);
   234          release();
   235          ps = tmp;
   236      }
   237      else if (r.type == Param::REAL)
   238      {
   239          AutoBuffer<double, 1> *tmp = new AutoBuffer<double, 1>(*r.pd);
   240          release();
   241          pd = tmp;
   242      }
   243  
   244      type = r.type;
   245  
   246      return *this;
   247  }
   248  
   249  inline DictValue::DictValue(const DictValue &r)
   250      : pv(NULL)
   251  {
   252      type = r.type;
   253  
   254      if (r.type == Param::INT)
   255          pi = new AutoBuffer<int64, 1>(*r.pi);
   256      else if (r.type == Param::STRING)
   257          ps = new AutoBuffer<String, 1>(*r.ps);
   258      else if (r.type == Param::REAL)
   259          pd = new AutoBuffer<double, 1>(*r.pd);
   260  }
   261  
   262  inline bool DictValue::isString() const
   263  {
   264      return (type == Param::STRING);
   265  }
   266  
   267  inline bool DictValue::isInt() const
   268  {
   269      return (type == Param::INT);
   270  }
   271  
   272  inline bool DictValue::isReal() const
   273  {
   274      return (type == Param::REAL || type == Param::INT);
   275  }
   276  
   277  inline int DictValue::size() const
   278  {
   279      switch (type)
   280      {
   281      case Param::INT:
   282          return (int)pi->size();
   283      case Param::STRING:
   284          return (int)ps->size();
   285      case Param::REAL:
   286          return (int)pd->size();
   287      case Param::BOOLEAN:
   288      case Param::MAT:
   289      case Param::MAT_VECTOR:
   290      case Param::ALGORITHM:
   291      case Param::FLOAT:
   292      case Param::UNSIGNED_INT:
   293      case Param::UINT64:
   294      case Param::UCHAR:
   295      case Param::SCALAR:
   296          break; // unhandled
   297      }
   298      CV_Error_(Error::StsInternal, ("Unhandled type (%d)", static_cast<int>(type)));
   299  }
   300  
   301  inline std::ostream &operator<<(std::ostream &stream, const DictValue &dictv)
   302  {
   303      int i;
   304  
   305      if (dictv.isInt())
   306      {
   307          for (i = 0; i < dictv.size() - 1; i++)
   308              stream << dictv.get<int64>(i) << ", ";
   309          stream << dictv.get<int64>(i);
   310      }
   311      else if (dictv.isReal())
   312      {
   313          for (i = 0; i < dictv.size() - 1; i++)
   314              stream << dictv.get<double>(i) << ", ";
   315          stream << dictv.get<double>(i);
   316      }
   317      else if (dictv.isString())
   318      {
   319          for (i = 0; i < dictv.size() - 1; i++)
   320              stream << "\"" << dictv.get<String>(i) << "\", ";
   321          stream << dictv.get<String>(i);
   322      }
   323  
   324      return stream;
   325  }
   326  
   327  /////////////////////////////////////////////////////////////////
   328  
   329  inline bool Dict::has(const String &key) const
   330  {
   331      return dict.count(key) != 0;
   332  }
   333  
   334  inline DictValue *Dict::ptr(const String &key)
   335  {
   336      _Dict::iterator i = dict.find(key);
   337      return (i == dict.end()) ? NULL : &i->second;
   338  }
   339  
   340  inline const DictValue *Dict::ptr(const String &key) const
   341  {
   342      _Dict::const_iterator i = dict.find(key);
   343      return (i == dict.end()) ? NULL : &i->second;
   344  }
   345  
   346  inline const DictValue &Dict::get(const String &key) const
   347  {
   348      _Dict::const_iterator i = dict.find(key);
   349      if (i == dict.end())
   350          CV_Error(Error::StsObjectNotFound, "Required argument \"" + key + "\" not found into dictionary");
   351      return i->second;
   352  }
   353  
   354  template <typename T>
   355  inline T Dict::get(const String &key) const
   356  {
   357      return this->get(key).get<T>();
   358  }
   359  
   360  template <typename T>
   361  inline T Dict::get(const String &key, const T &defaultValue) const
   362  {
   363      _Dict::const_iterator i = dict.find(key);
   364  
   365      if (i != dict.end())
   366          return i->second.get<T>();
   367      else
   368          return defaultValue;
   369  }
   370  
   371  template<typename T>
   372  inline const T &Dict::set(const String &key, const T &value)
   373  {
   374      _Dict::iterator i = dict.find(key);
   375  
   376      if (i != dict.end())
   377          i->second = DictValue(value);
   378      else
   379          dict.insert(std::make_pair(key, DictValue(value)));
   380  
   381      return value;
   382  }
   383  
   384  inline void Dict::erase(const String &key)
   385  {
   386      dict.erase(key);
   387  }
   388  
   389  inline std::ostream &operator<<(std::ostream &stream, const Dict &dict)
   390  {
   391      Dict::_Dict::const_iterator it;
   392      for (it = dict.dict.begin(); it != dict.dict.end(); it++)
   393          stream << it->first << " : " << it->second << "\n";
   394  
   395      return stream;
   396  }
   397  
   398  inline std::map<String, DictValue>::const_iterator Dict::begin() const
   399  {
   400      return dict.begin();
   401  }
   402  
   403  inline std::map<String, DictValue>::const_iterator Dict::end() const
   404  {
   405      return dict.end();
   406  }
   407  
   408  CV__DNN_INLINE_NS_END
   409  }
   410  }
   411  
   412  #endif