layered_maps.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Software License Agreement (BSD License) *
3  * Copyright (C) 2016 by Horatiu George Todoran <todorangrg@gmail.com> *
4  * *
5  * Redistribution and use in source and binary forms, with or without *
6  * modification, are permitted provided that the following conditions *
7  * are met: *
8  * *
9  * 1. Redistributions of source code must retain the above copyright *
10  * notice, this list of conditions and the following disclaimer. *
11  * 2. Redistributions in binary form must reproduce the above copyright *
12  * notice, this list of conditions and the following disclaimer in *
13  * the documentation and/or other materials provided with the *
14  * distribution. *
15  * 3. Neither the name of the copyright holder nor the names of its *
16  * contributors may be used to endorse or promote products derived *
17  * from this software without specific prior written permission. *
18  * *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
22  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *
23  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, *
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *
25  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; *
26  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *
27  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY *
29  * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE *
30  * POSSIBILITY OF SUCH DAMAGE. *
31  ***************************************************************************/
32 
34 
35 #include <opencv2/core/core.hpp>
36 #include <opencv2/core/core_c.h>
37 #include <opencv2/opencv.hpp>
38 
39 using namespace tuw;
40 using namespace std;
41 using namespace cv;
42 
44 
45 }
46 
47 void LayeredMaps::initLayers( int width_pixel, int height_pixel,
48  double min_x, double max_x,
49  double min_y, double max_y, double rotation ) {
50  init(width_pixel, height_pixel, min_x, max_x, min_y, max_y, rotation);
51  initLayers();
52 }
53 
54 size_t LayeredMaps::sizeLayers() const {
55  return mapLayers_.size();
56 }
57 
58 
59 void LayeredMaps::resizeLayers( const size_t& _n ) {
60  mapLayers_.resize ( _n );
61 }
62 
64  for(size_t i = 0; i < mapLayers_.size(); i++){ mapLayers_[i].create ( width(), height(), CV_32FC1 ); clearLayer(i); }
65 }
66 
68  for(size_t i = 0; i < mapLayers_.size(); i++){ clearLayer(i); }
69 }
70 void LayeredMaps::clearLayer( const size_t& _layer ) {
71  mapLayers_[_layer].setTo( 1 );
72 }
73 
74 cv::Mat& LayeredMaps::mapLayer( const size_t& _layer ) {
75  return mapLayers_[_layer];
76 }
77 const cv::Mat& LayeredMaps::mapLayer( const size_t& _layer ) const {
78  return mapLayers_[_layer];
79 }
80 
81 double LayeredMaps::getVal( const size_t& _layer, const Point2D& _worldPos, Interpolation _interpolationType ) const
82 {
83  double retVal = -100;
84  Point2D mapPos = w2m(_worldPos);
85  if (!mapPos.inside(0, 0, mapLayer(_layer).rows - 1, mapLayer(_layer).cols - 1))
86  {
87  return retVal;
88  }
89  const double mapPos_row_d = mapPos.y() , mapPos_col_d = mapPos.x();
90  const int mapPos_row_i = int(mapPos_row_d), mapPos_col_i = int(mapPos_col_d);
91 
92  switch ( _interpolationType )
93  {
94  case SIMPLE :
95  retVal = mapLayer(_layer).at<float_t>( mapPos_row_i, mapPos_col_i );
96  break;
97  case BILINEAR:
98  //if((mapPos_y_i+1 >= mapLayer(layer).rows)||(mapPos_x_i+1 >= mapLayer(layer).cols)||(mapPos_y_i <0)||(mapPos_x_i <0)){throw 0;}
99 
100  const double f00 = mapLayer(_layer).at<float_t>(mapPos_row_i , mapPos_col_i );
101  const double f10 = mapLayer(_layer).at<float_t>(mapPos_row_i + 1, mapPos_col_i );
102  const double f01 = mapLayer(_layer).at<float_t>(mapPos_row_i , mapPos_col_i + 1);
103  const double f11 = mapLayer(_layer).at<float_t>(mapPos_row_i + 1, mapPos_col_i + 1);
104 
105  const double mapPosRed_row = mapPos_row_d - mapPos_row_i, mapPosRed_col = mapPos_col_d - mapPos_col_i;
106 
107  retVal = f00 * (1 - mapPosRed_row) * (1 - mapPosRed_col) +
108  f10 * mapPosRed_row * (1 - mapPosRed_col) +
109  f01 * (1 - mapPosRed_row) * mapPosRed_col +
110  f11 * mapPosRed_row * mapPosRed_col;
111  break;
112  }
113  return retVal;
114 }
115 
116 float distance2probabilitySigmoid ( float d, float threshold ) {
117  float p = 0;
118  if ( d < threshold ) {
119  p = tanh ( ( 2*M_PI*-d ) /threshold+M_PI ) * 0.5 + 0.5;
120  }
121  return p;
122 }
123 float distance2probabilityTriangle ( float d, float threshold ) {
124  float p = 0;
125  if ( d < threshold ) {
126  p = 1.-d/threshold;
127  }
128  return p;
129 }
130 
131 void LayeredMaps::computeDistanceField ( Mat& _mDst, vector< Point2D >& _pSrc, const double& _radius, bool _flipDistance, bool connectPoints ) const {
132  Mat srcMap; srcMap.create ( width(), height(), CV_32FC1 ); srcMap.setTo ( 1 );
133  Scalar colour ( 0 );
134  if(connectPoints){ for ( size_t i = 1; i < _pSrc.size(); i++ ) { line ( srcMap, _pSrc[i-1], _pSrc[i], colour, 8); } }
135  else { for ( size_t i = 0; i < _pSrc.size(); i++ ) { circle ( srcMap, _pSrc[i], 1, colour, 1, 8); } }
136  computeDistanceField ( _mDst, srcMap, _radius, _flipDistance );
137 }
138 
139 
140 void LayeredMaps::computeDistanceField ( Mat& _mDst, Mat& _mSrc, const double& _radius, bool _flipDistance ) const {
141  Mat srcMap;
142  _mSrc.convertTo(srcMap, CV_8U);
144  int maskSize0 = cv::DIST_MASK_PRECISE;
145  int voronoiType = -1;
146  int distType0 = cv::DIST_L2;//CV_DIST_L1;
147  int maskSize = voronoiType >= 0 ? cv::DIST_MASK_5 : maskSize0;
148  int distType = voronoiType >= 0 ? cv::DIST_L2 : distType0;
149  Mat destMap_f, labels;
150 // destMap_f.create ( width(), height(), CV_32F );
151  if ( voronoiType < 0 ){ cv::distanceTransform ( srcMap, destMap_f, distType, maskSize ); }
152  else { cv::distanceTransform ( srcMap, destMap_f, labels, distType, maskSize, voronoiType ); }
153 // destMap_f.convertTo(destMap_ui, CV_8U );
154 
155  CV_Assert(destMap_f.depth() == CV_32F);
156  int channels = destMap_f.channels();
157  int nRows = destMap_f.rows;
158  int nCols = destMap_f.cols * channels;
159  if (destMap_f.isContinuous()) { nCols *= nRows; nRows = 1; }
160 
161  float threshold = _radius * scale_x ();
162  float_t* p_d; float* p_s;
163  for(int i = 0; i < nRows; ++i) {
164  p_d = destMap_f.ptr<float_t>(i);
165  for (int j = 0; j < nCols; ++j) { if (_flipDistance) { p_d[j] = (float_t)( distance2probabilityTriangle ( p_d[j], threshold ) ); }
166  else { p_d[j] = (float_t)( (1. - distance2probabilityTriangle ( p_d[j], threshold ) ) ); } }
167  }
168  if ( ( _mDst.channels() != 1 ) && ( _mDst.channels() != 5 ) ) { cvtColor(destMap_f, _mDst, cv::COLOR_GRAY2BGR ); }
169  else { _mDst = destMap_f; }
170 
171 }
tuw::Point2D::y
const double & y() const
Definition: point2d.cpp:49
test_point2d.p
p
Definition: test_point2d.py:20
tuw::Point2D::inside
bool inside(double x0, double y0, double x1, double y1) const
Definition: point2d.cpp:171
tuw::LayeredMaps::computeDistanceField
void computeDistanceField(cv::Mat &_mDst, std::vector< Point2D > &_pSrc, const double &_radius, bool _flipDistance=false, bool connectPoints=false) const
tuw::Point2D::x
const double & x() const
Definition: point2d.cpp:35
tuw::LayeredMaps::LayeredMaps
LayeredMaps()
Definition: layered_maps.cpp:43
distance2probabilitySigmoid
float distance2probabilitySigmoid(float d, float threshold)
Definition: layered_maps.cpp:116
tuw::LayeredMaps::Interpolation
Interpolation
Definition: layered_maps.h:78
tuw::LayeredMaps::clearLayers
void clearLayers()
Definition: layered_maps.cpp:67
tuw
Definition: command.h:8
d
d
tuw::Point2D
Definition: point2d.h:19
tuw::LayeredMaps::mapLayer
cv::Mat & mapLayer(const size_t &_layer)
Definition: layered_maps.cpp:74
layered_maps.h
tuw::LayeredMaps::initLayers
virtual void initLayers()
Definition: layered_maps.cpp:63
distance2probabilityTriangle
float distance2probabilityTriangle(float d, float threshold)
Definition: layered_maps.cpp:123
std
tuw::LayeredMaps::sizeLayers
size_t sizeLayers() const
Definition: layered_maps.cpp:54
init
void init(const M_string &remappings)
cv
Definition: point2d.h:208
tuw::LayeredMaps::resizeLayers
void resizeLayers(const size_t &_n)
Definition: layered_maps.cpp:59
tuw::LayeredMaps::clearLayer
void clearLayer(const size_t &_layer)
Definition: layered_maps.cpp:70
tuw::LayeredMaps::getVal
double getVal(const size_t &_layer, const tuw::Point2D &_worldPos, Interpolation interpolationType=BILINEAR) const
Definition: layered_maps.cpp:81
cvtColor
CvImagePtr cvtColor(const CvImageConstPtr &source, const std::string &encoding)


tuw_geometry
Author(s): Markus Bader
autogenerated on Sun Feb 26 2023 03:25:40