Go to the documentation of this file.00001 #include "openni_capture.h"
00002 #include <pcl/io/pcd_io.h>
00003 #include <boost/thread/mutex.hpp>
00004 #include <boost/make_shared.hpp>
00005
00006 OpenNICapture::OpenNICapture (const std::string& device_id)
00007 : grabber_ (device_id)
00008 , most_recent_frame_ ()
00009 , frame_counter_ (0)
00010 , use_trigger_ (false)
00011 , trigger_ (false)
00012 {
00013
00014 boost::function<void (const PointCloudConstPtr&)> frame_cb = boost::bind (&OpenNICapture::onNewFrame, this, _1);
00015
00016 grabber_.registerCallback (frame_cb);
00017 grabber_.start ();
00018 }
00019
00020 OpenNICapture::~OpenNICapture ()
00021 {
00022
00023 grabber_.stop ();
00024 }
00025
00026 void
00027 OpenNICapture::setTriggerMode (bool use_trigger)
00028 {
00029 use_trigger_ = use_trigger;
00030 }
00031
00032 const PointCloudPtr
00033 OpenNICapture::snap ()
00034 {
00035 if (use_trigger_)
00036 {
00037 if (!preview_)
00038 {
00039
00040 preview_ = boost::shared_ptr<pcl::visualization::PCLVisualizer> (new pcl::visualization::PCLVisualizer ());
00041
00042 boost::function<void (const pcl::visualization::KeyboardEvent&)> keyboard_cb =
00043 boost::bind (&OpenNICapture::onKeyboardEvent, this, _1);
00044
00045 preview_->registerKeyboardCallback (keyboard_cb);
00046 }
00047 waitForTrigger ();
00048 }
00049
00050 int old_frame = frame_counter_;
00051 while (frame_counter_ == old_frame) continue;
00052 return (most_recent_frame_);
00053 }
00054
00055 const PointCloudPtr
00056 OpenNICapture::snapAndSave (const std::string & filename)
00057 {
00058 PointCloudPtr snapped_frame = snap ();
00059 if (snapped_frame)
00060 pcl::io::savePCDFile (filename, *snapped_frame);
00061 return (snapped_frame);
00062 }
00063
00064
00065 void
00066 OpenNICapture::onNewFrame (const PointCloudConstPtr &cloud)
00067 {
00068 mutex_.lock ();
00069 ++frame_counter_;
00070 most_recent_frame_ = boost::make_shared<PointCloud> (*cloud);
00071 mutex_.unlock ();
00072 }
00073
00074 void
00075 OpenNICapture::onKeyboardEvent (const pcl::visualization::KeyboardEvent & event)
00076 {
00077
00078 mutex_.lock ();
00079 if (event.keyDown () && event.getKeySym () == "space")
00080 {
00081 trigger_ = true;
00082 }
00083 mutex_.unlock ();
00084 }
00085
00087 void
00088 OpenNICapture::waitForTrigger ()
00089 {
00090
00091 trigger_ = false;
00092
00093 int last_frame = frame_counter_;
00094
00095
00096 while (!trigger_)
00097 {
00098
00099 if (frame_counter_ > last_frame)
00100 {
00101 last_frame = frame_counter_;
00102 if (most_recent_frame_)
00103 {
00104 mutex_.lock ();
00105 if (!preview_->updatePointCloud (most_recent_frame_, "preview"))
00106 {
00107 preview_->addPointCloud (most_recent_frame_, "preview");
00108 preview_->resetCameraViewpoint ("preview");
00109 }
00110 mutex_.unlock ();
00111 }
00112 preview_->spinOnce ();
00113 }
00114 }
00115 }