Point Cloud Library (PCL)  1.11.1-dev
image_depth.h
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Point Cloud Library (PCL) - www.pointclouds.org
5  * Copyright (c) 2011 Willow Garage, Inc.
6  * Copyright (c) 2012-, Open Perception, Inc.
7  *
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * * Redistributions of source code must retain the above copyright
15  * notice, this list of conditions and the following disclaimer.
16  * * Redistributions in binary form must reproduce the above
17  * copyright notice, this list of conditions and the following
18  * disclaimer in the documentation and/or other materials provided
19  * with the distribution.
20  * * Neither the name of the copyright holder(s) nor the names of its
21  * contributors may be used to endorse or promote products derived
22  * from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  *
37  */
38 
39 #pragma once
40 
41 #include <chrono>
42 
43 #include <pcl/pcl_config.h>
44 #include <pcl/pcl_exports.h>
45 
46 #include<pcl/io/image_metadata_wrapper.h>
47 
48 namespace pcl
49 {
50  namespace io
51  {
52  /** \brief This class provides methods to fill a depth or disparity image.
53  */
55  {
56  public:
57  using Ptr = shared_ptr<DepthImage>;
58  using ConstPtr = shared_ptr<const DepthImage>;
59 
60  using Clock = std::chrono::high_resolution_clock;
61  using Timestamp = std::chrono::high_resolution_clock::time_point;
62 
63  /** \brief Constructor
64  * \param[in] depth_metadata the actual data from the OpenNI library
65  * \param[in] baseline the baseline of the "stereo" camera, i.e. the distance between the projector and the IR camera for
66  * Primesense like cameras. e.g. 7.5cm for PSDK5 and PSDK6 reference design.
67  * \param[in] focal_length focal length of the "stereo" frame.
68  * \param[in] shadow_value defines which values in the depth data are indicating shadow (resulting from the parallax between projector and IR camera)
69  * \param[in] no_sample_value defines which values in the depth data are indicating that no depth (disparity) could be determined .
70  * \attention The focal length may change, depending whether the depth stream is registered/mapped to the RGB stream or not.
71  */
72  DepthImage (FrameWrapper::Ptr depth_metadata, float baseline, float focal_length, std::uint64_t shadow_value, std::uint64_t no_sample_value);
73  DepthImage (FrameWrapper::Ptr depth_metadata, float baseline, float focal_length, std::uint64_t shadow_value, std::uint64_t no_sample_value, Timestamp time);
74 
75  /** \brief Destructor. Never throws an exception. */
76  ~DepthImage ();
77 
78  /** \brief method to access the internal data structure from OpenNI. If the data is accessed just read-only, then this method is faster than a fillXXX method
79  * \return the actual depth data of type openni::VideoFrameRef.
80  */
81  const FrameWrapper::Ptr
82  getMetaData () const;
83 
84  /** \brief fills a user given block of memory with the disparity values with additional nearest-neighbor down-scaling.
85  * \param[in] width the width of the desired disparity image.
86  * \param[in] height the height of the desired disparity image.
87  * \param[in,out] disparity_buffer the float pointer to the actual memory buffer to be filled with the disparity values.
88  * \param[in] line_step if only a rectangular sub region of the buffer needs to be filled, then line_step is the
89  * width in bytes (not floats) of the original width of the depth buffer.
90  */
91  void
92  fillDisparityImage (unsigned width, unsigned height, float* disparity_buffer, unsigned line_step = 0) const;
93 
94  /** \brief fills a user given block of memory with the disparity values with additional nearest-neighbor down-scaling.
95  * \param[in] width width the width of the desired depth image.
96  * \param[in] height height the height of the desired depth image.
97  * \param[in,out] depth_buffer the float pointer to the actual memory buffer to be filled with the depth values.
98  * \param[in] line_step if only a rectangular sub region of the buffer needs to be filled, then line_step is the
99  * width in bytes (not floats) of the original width of the depth buffer.
100  */
101  void
102  fillDepthImage (unsigned width, unsigned height, float* depth_buffer, unsigned line_step = 0) const;
103 
104  /** \brief fills a user given block of memory with the raw values with additional nearest-neighbor down-scaling.
105  * \param[in] width width the width of the desired raw image.
106  * \param[in] height height the height of the desired raw image.
107  * \param[in,out] depth_buffer the unsigned short pointer to the actual memory buffer to be filled with the raw values.
108  * \param[in] line_step if only a rectangular sub region of the buffer needs to be filled, then line_step is the
109  * width in bytes (not floats) of the original width of the depth buffer.
110  */
111  void
112  fillDepthImageRaw (unsigned width, unsigned height, unsigned short* depth_buffer, unsigned line_step = 0) const;
113 
114  /** \brief method to access the baseline of the "stereo" frame that was used to retrieve the depth image.
115  * \return baseline in meters
116  */
117  float
118  getBaseline () const;
119 
120  /** \brief method to access the focal length of the "stereo" frame that was used to retrieve the depth image.
121  * \return focal length in pixels
122  */
123  float
124  getFocalLength () const;
125 
126  /** \brief method to access the shadow value, that indicates pixels lying in shadow in the depth image.
127  * \return shadow value
128  */
129  std::uint64_t
130  getShadowValue () const;
131 
132  /** \brief method to access the no-sample value, that indicates pixels where no disparity could be determined for the depth image.
133  * \return no-sample value
134  */
135  std::uint64_t
136  getNoSampleValue () const;
137 
138  /** \return the width of the depth image */
139  unsigned
140  getWidth () const;
141 
142  /** \return the height of the depth image */
143  unsigned
144  getHeight () const;
145 
146  /** \return an ascending id for the depth frame
147  * \attention not necessarily synchronized with other streams
148  */
149  unsigned
150  getFrameID () const;
151 
152  /** \return a ascending timestamp for the depth frame
153  * \attention its not the system time, thus can not be used directly to synchronize different sensors.
154  * But definitely synchronized with other streams
155  */
156  std::uint64_t
157  getTimestamp () const;
158 
159  Timestamp
160  getSystemTimestamp () const;
161 
162  // Get a const pointer to the raw depth buffer
163  const unsigned short*
164  getData ();
165 
166  // Data buffer size in bytes
167  int
168  getDataSize () const;
169 
170  // Size of each row, including any padding
171  inline unsigned
172  getStep() const
173  {
174  return (getDataSize() / getHeight());
175  }
176 
177  protected:
179 
180  float baseline_;
182  std::uint64_t shadow_value_;
183  std::uint64_t no_sample_value_;
185  };
186 
187 }} // namespace
pcl
Definition: convolution.h:46
pcl::io::DepthImage::ConstPtr
shared_ptr< const DepthImage > ConstPtr
Definition: image_depth.h:58
pcl::io::FrameWrapper::Ptr
shared_ptr< FrameWrapper > Ptr
Definition: image_metadata_wrapper.h:56
pcl::io::DepthImage::wrapper_
pcl::io::FrameWrapper::Ptr wrapper_
Definition: image_depth.h:178
pcl::io::DepthImage::baseline_
float baseline_
Definition: image_depth.h:180
pcl::io::DepthImage::getStep
unsigned getStep() const
Definition: image_depth.h:172
pcl::io::DepthImage::Clock
std::chrono::high_resolution_clock Clock
Definition: image_depth.h:60
pcl::io::DepthImage::Timestamp
std::chrono::high_resolution_clock::time_point Timestamp
Definition: image_depth.h:61
pcl::io::DepthImage::focal_length_
float focal_length_
Definition: image_depth.h:181
pcl::io::DepthImage::no_sample_value_
std::uint64_t no_sample_value_
Definition: image_depth.h:183
pcl::io::DepthImage
This class provides methods to fill a depth or disparity image.
Definition: image_depth.h:54
pcl::io::DepthImage::shadow_value_
std::uint64_t shadow_value_
Definition: image_depth.h:182
pcl::io::DepthImage::timestamp_
Timestamp timestamp_
Definition: image_depth.h:184
PCL_EXPORTS
#define PCL_EXPORTS
Definition: pcl_macros.h:323
pcl::io::DepthImage::Ptr
shared_ptr< DepthImage > Ptr
Definition: image_depth.h:57