Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include <boost/thread/thread.hpp>
00041 #include <boost/date_time/posix_time/posix_time.hpp>
00042 #include <pcl/point_cloud.h>
00043 #include <pcl/point_types.h>
00044 #include <pcl/common/time.h>
00045 #include <pcl/io/oni_grabber.h>
00046 #include <pcl/visualization/cloud_viewer.h>
00047 #include <vector>
00048 #include <pcl/common/time_trigger.h>
00049
00050 #define SHOW_FPS 1
00051 #if SHOW_FPS
00052 #define FPS_CALC(_WHAT_) \
00053 do \
00054 { \
00055 static unsigned count = 0;\
00056 static double last = pcl::getTime ();\
00057 ++count; \
00058 if (pcl::getTime() - last >= 1.0) \
00059 { \
00060 double now = pcl::getTime (); \
00061 std::cout << "Average framerate("<< _WHAT_ << "): " << double(count)/double(now - last) << " Hz" << std::endl; \
00062 count = 0; \
00063 last = now; \
00064 } \
00065 }while(false)
00066 #else
00067 #define FPS_CALC(_WHAT_) \
00068 do \
00069 { \
00070 }while(false)
00071 #endif
00072
00073 template <typename PointType>
00074 class SimpleONIViewer
00075 {
00076 public:
00077 typedef pcl::PointCloud<PointType> Cloud;
00078 typedef typename Cloud::ConstPtr CloudConstPtr;
00079
00080 SimpleONIViewer(pcl::ONIGrabber& grabber)
00081 : viewer("PCL OpenNI Viewer")
00082 , grabber_(grabber)
00083 {
00084 }
00085
00090 void
00091 cloud_cb_ (const CloudConstPtr& cloud)
00092 {
00093 FPS_CALC ("callback");
00094 boost::mutex::scoped_lock lock (mtx_);
00095 cloud_ = cloud;
00096 }
00097
00102 CloudConstPtr
00103 getLatestCloud ()
00104 {
00105
00106 boost::mutex::scoped_lock lock(mtx_);
00107 CloudConstPtr temp_cloud;
00108 temp_cloud.swap (cloud_);
00109
00110
00111 return (temp_cloud);
00112 }
00113
00117 void
00118 run()
00119 {
00120
00121
00122 boost::function<void (const CloudConstPtr&) > f = boost::bind (&SimpleONIViewer::cloud_cb_, this, _1);
00123
00124 boost::signals2::connection c = grabber_.registerCallback (f);
00125
00126 grabber_.start();
00127
00128 while (!viewer.wasStopped ())
00129 {
00130 if (cloud_)
00131 {
00132 FPS_CALC ("drawing");
00133
00134 viewer.showCloud (getLatestCloud ());
00135 }
00136 }
00137
00138 grabber_.stop();
00139 }
00140
00141 pcl::visualization::CloudViewer viewer;
00142 pcl::ONIGrabber& grabber_;
00143 boost::mutex mtx_;
00144 CloudConstPtr cloud_;
00145 };
00146
00147 void
00148 usage(char ** argv)
00149 {
00150 cout << "usage: " << argv[0] << " <path-to-oni-file> [framerate]\n";
00151 cout << argv[0] << " -h | --help : shows this help" << endl;
00152 return;
00153 }
00154
00155 int
00156 main(int argc, char ** argv)
00157 {
00158 std::string arg("");
00159
00160 unsigned frame_rate = 0;
00161 if (argc >= 2)
00162 {
00163 arg = argv[1];
00164
00165 if (arg == "--help" || arg == "-h")
00166 {
00167 usage(argv);
00168 return 1;
00169 }
00170
00171 if (argc >= 3)
00172 {
00173 frame_rate = atoi(argv[2]);
00174 }
00175 }
00176 else
00177 {
00178 usage (argv);
00179 return 1;
00180 }
00181
00182 pcl::TimeTrigger trigger;
00183
00184 pcl::ONIGrabber* grabber = 0;
00185 if (frame_rate == 0)
00186 grabber = new pcl::ONIGrabber(arg, true, true);
00187 else
00188 {
00189 grabber = new pcl::ONIGrabber(arg, true, false);
00190 trigger.setInterval (1.0 / (double) frame_rate);
00191 trigger.registerCallback (boost::bind(&pcl::ONIGrabber::start, grabber));
00192 trigger.start();
00193 }
00194 if (grabber->providesCallback<pcl::ONIGrabber::sig_cb_openni_point_cloud_rgb > ())
00195 {
00196 SimpleONIViewer<pcl::PointXYZRGBA> v(*grabber);
00197 v.run();
00198 }
00199 else
00200 {
00201 SimpleONIViewer<pcl::PointXYZI> v(*grabber);
00202 v.run();
00203 }
00204
00205 return (0);
00206 }