41 #ifndef __PCL_IO_OPENNI_GRABBER__
42 #define __PCL_IO_OPENNI_GRABBER__
53 #include <boost/thread/mutex.hpp>
74 OpenNI_Default_Mode = 0,
81 OpenNI_QQVGA_25Hz = 7,
82 OpenNI_QQVGA_30Hz = 8,
87 typedef void (sig_cb_openni_image) (
const boost::shared_ptr<openni_wrapper::Image>&);
88 typedef void (sig_cb_openni_depth_image) (
const boost::shared_ptr<openni_wrapper::DepthImage>&);
89 typedef void (sig_cb_openni_ir_image) (
const boost::shared_ptr<openni_wrapper::IRImage>&);
90 typedef void (sig_cb_openni_image_depth_image) (
const boost::shared_ptr<openni_wrapper::Image>&,
const boost::shared_ptr<openni_wrapper::DepthImage>&,
float constant) ;
91 typedef void (sig_cb_openni_ir_depth_image) (
const boost::shared_ptr<openni_wrapper::IRImage>&,
const boost::shared_ptr<openni_wrapper::DepthImage>&,
float constant) ;
92 typedef void (sig_cb_openni_point_cloud) (
const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ> >&);
93 typedef void (sig_cb_openni_point_cloud_rgb) (
const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >&);
94 typedef void (sig_cb_openni_point_cloud_rgba) (
const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGBA> >&);
95 typedef void (sig_cb_openni_point_cloud_i) (
const boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZI> >&);
96 typedef void (sig_cb_openni_point_cloud_eigen) (
const boost::shared_ptr<const pcl::PointCloud<Eigen::MatrixXf> >&);
104 OpenNIGrabber (
const std::string& device_id =
"",
105 const Mode& depth_mode = OpenNI_Default_Mode,
106 const Mode& image_mode = OpenNI_Default_Mode);
109 virtual ~OpenNIGrabber () throw ();
128 getFramesPerSecond () const;
131 inline boost::shared_ptr<openni_wrapper::OpenNIDevice>
135 std::vector<std::pair<
int, XnMapOutputMode> >
136 getAvailableDepthModes () const;
139 std::vector<std::pair<
int, XnMapOutputMode> >
140 getAvailableImageModes () const;
145 onInit (const std::
string& device_id, const Mode& depth_mode, const Mode& image_mode);
149 setupDevice (const std::
string& device_id, const Mode& depth_mode, const Mode& image_mode);
157 startSynchronization ();
161 stopSynchronization ();
165 mapConfigMode2XnMode (
int mode, XnMapOutputMode &xnmode) const;
170 imageCallback (boost::shared_ptr<openni_wrapper::Image> image,
void* cookie);
174 depthCallback (boost::shared_ptr<openni_wrapper::DepthImage> depth_image,
void* cookie);
178 irCallback (boost::shared_ptr<openni_wrapper::IRImage> ir_image,
void* cookie);
182 imageDepthImageCallback (const boost::shared_ptr<openni_wrapper::Image> &image,
183 const boost::shared_ptr<openni_wrapper::DepthImage> &depth_image);
187 irDepthImageCallback (const boost::shared_ptr<openni_wrapper::IRImage> &image,
188 const boost::shared_ptr<openni_wrapper::DepthImage> &depth_image);
198 checkImageAndDepthSynchronizationRequired ();
202 checkImageStreamRequired ();
206 checkDepthStreamRequired ();
210 checkIRStreamRequired ();
213 boost::shared_ptr<pcl::
PointCloud<pcl::PointXYZ> >
214 convertToXYZPointCloud (const boost::shared_ptr<openni_wrapper::DepthImage> &depth) const;
218 convertToXYZRGBPointCloud (const boost::shared_ptr<openni_wrapper::Image> &image,
219 const boost::shared_ptr<openni_wrapper::DepthImage> &depth_image) const;
221 boost::shared_ptr<pcl::
PointCloud<pcl::PointXYZI> >
222 convertToXYZIPointCloud (const boost::shared_ptr<openni_wrapper::IRImage> &image,
223 const boost::shared_ptr<openni_wrapper::DepthImage> &depth_image) const;
225 Synchronizer<boost::shared_ptr<openni_wrapper::Image>, boost::shared_ptr<openni_wrapper::DepthImage> > rgb_sync_;
226 Synchronizer<boost::shared_ptr<openni_wrapper::IRImage>, boost::shared_ptr<openni_wrapper::DepthImage> > ir_sync_;
233 boost::shared_ptr<pcl::
PointCloud<Eigen::MatrixXf> >
234 convertToEigenPointCloud (const boost::shared_ptr<openni_wrapper::Image> &image,
235 const boost::shared_ptr<openni_wrapper::DepthImage> &depth_image) const;
238 boost::shared_ptr<openni_wrapper::OpenNIDevice> device_;
240 std::
string rgb_frame_id_;
241 std::
string depth_frame_id_;
242 unsigned image_width_;
243 unsigned image_height_;
244 unsigned depth_width_;
245 unsigned depth_height_;
247 bool image_required_;
248 bool depth_required_;
252 boost::signals2::signal<sig_cb_openni_image>* image_signal_;
253 boost::signals2::signal<sig_cb_openni_depth_image>* depth_image_signal_;
254 boost::signals2::signal<sig_cb_openni_ir_image>* ir_image_signal_;
255 boost::signals2::signal<sig_cb_openni_image_depth_image>* image_depth_image_signal_;
256 boost::signals2::signal<sig_cb_openni_ir_depth_image>* ir_depth_image_signal_;
257 boost::signals2::signal<sig_cb_openni_point_cloud>* point_cloud_signal_;
258 boost::signals2::signal<sig_cb_openni_point_cloud_i>* point_cloud_i_signal_;
259 boost::signals2::signal<sig_cb_openni_point_cloud_rgb>* point_cloud_rgb_signal_;
260 boost::signals2::signal<sig_cb_openni_point_cloud_rgba>* point_cloud_rgba_signal_;
261 boost::signals2::signal<sig_cb_openni_point_cloud_eigen>* point_cloud_eigen_signal_;
266 bool operator () (
const XnMapOutputMode& mode1,
const XnMapOutputMode & mode2)
const
268 if (mode1.nXRes < mode2.nXRes)
270 else if (mode1.nXRes > mode2.nXRes)
272 else if (mode1.nYRes < mode2.nYRes)
274 else if (mode1.nYRes > mode2.nYRes)
276 else if (mode1.nFPS < mode2.nFPS)
282 std::map<int, XnMapOutputMode> config2xn_map_;
284 openni_wrapper::OpenNIDevice::CallbackHandle depth_callback_handle;
285 openni_wrapper::OpenNIDevice::CallbackHandle image_callback_handle;
286 openni_wrapper::OpenNIDevice::CallbackHandle ir_callback_handle;
290 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
293 boost::shared_ptr<openni_wrapper::OpenNIDevice>
294 OpenNIGrabber::getDevice ()
const
300 #endif // __PCL_IO_OPENNI_GRABBER__
301 #endif // HAVE_OPENNI