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 #include <pcl/apps/pcd_video_player.h>
00040 #include <pcl/io/pcd_io.h>
00041 #include <pcl/point_types.h>
00042 
00043 
00044 #include <iostream>
00045 #include <fstream>
00046 
00047 
00048 #include <boost/filesystem.hpp>
00049 #include <boost/foreach.hpp>
00050 #include <boost/property_tree/xml_parser.hpp>
00051 #include <boost/property_tree/ptree.hpp>
00052 
00053 
00054 #include <QApplication>
00055 #include <QMutexLocker>
00056 #include <QEvent>
00057 #include <QObject>
00058 #include <QFileDialog>
00059 #include <QGroupBox>
00060 #include <QRadioButton>
00061 #include <QButtonGroup>
00062 
00063 
00064 #include <vtkRenderWindow.h>
00065 #include <vtkRendererCollection.h>
00066 #include <vtkCamera.h>
00067 
00068 using namespace pcl;
00069 using namespace std;
00070 
00072 PCDVideoPlayer::PCDVideoPlayer ()
00073 {
00074   cloud_present_ = false;
00075   cloud_modified_ = false;
00076   play_mode_ = false;
00077   speed_counter_ = 0;
00078   speed_value_ = 5;
00079 
00080   
00081   vis_timer_ = new QTimer (this);
00082   vis_timer_->start (5);
00083 
00084   connect (vis_timer_, SIGNAL (timeout ()), this, SLOT (timeoutSlot ()));
00085 
00086   ui_ = new Ui::MainWindow;
00087   ui_->setupUi (this);
00088   
00089   this->setWindowTitle ("PCL PCD Video Player");
00090 
00091   
00092   cloud_.reset (new pcl::PointCloud<pcl::PointXYZRGBA>);
00093 
00094   
00095   vis_.reset (new pcl::visualization::PCLVisualizer ("", false));
00096   ui_->qvtkWidget->SetRenderWindow (vis_->getRenderWindow ());
00097   vis_->setupInteractor (ui_->qvtkWidget->GetInteractor (), ui_->qvtkWidget->GetRenderWindow ());
00098   vis_->getInteractorStyle ()->setKeyboardModifier (pcl::visualization::INTERACTOR_KB_MOD_SHIFT);
00099   ui_->qvtkWidget->update ();
00100 
00101   
00102   connect (ui_->playButton, SIGNAL (clicked ()), this, SLOT (playButtonPressed ()));
00103   connect (ui_->stopButton, SIGNAL (clicked ()), this, SLOT (stopButtonPressed ()));
00104   connect (ui_->backButton, SIGNAL (clicked ()), this, SLOT (backButtonPressed ()));
00105   connect (ui_->nextButton, SIGNAL (clicked ()), this, SLOT (nextButtonPressed ()));
00106 
00107   connect (ui_->selectFolderButton, SIGNAL (clicked ()), this, SLOT (selectFolderButtonPressed ()));
00108   connect (ui_->selectFilesButton, SIGNAL (clicked ()), this, SLOT (selectFilesButtonPressed ()));
00109   
00110   connect (ui_->indexSlider, SIGNAL (valueChanged (int)), this, SLOT (indexSliderValueChanged (int)));
00111 }
00112 
00113 void 
00114 PCDVideoPlayer::backButtonPressed ()
00115 {
00116   if(current_frame_ == 0) 
00117   {
00118     PCL_DEBUG ("[PCDVideoPlayer::nextButtonPressed] : reached the end\n");
00119     current_frame_ = nr_of_frames_ - 1; 
00120   }
00121   else
00122   {
00123     current_frame_--;
00124     cloud_modified_ = true;
00125     ui_->indexSlider->setSliderPosition (current_frame_);        
00126   }
00127 }
00128 
00129 void 
00130 PCDVideoPlayer::nextButtonPressed ()
00131 {
00132   if (current_frame_ == (nr_of_frames_ - 1)) 
00133   {
00134     PCL_DEBUG ("[PCDVideoPlayer::nextButtonPressed] : reached the end\n");
00135     current_frame_ = 0; 
00136   }
00137   else
00138   {
00139     current_frame_++;
00140     cloud_modified_ = true;
00141     ui_->indexSlider->setSliderPosition (current_frame_);        
00142   }
00143 }
00144 
00145 void
00146 PCDVideoPlayer::selectFolderButtonPressed ()
00147 {
00148   pcd_files_.clear ();     
00149   pcd_paths_.clear ();     
00150 
00151   dir_ = QFileDialog::getExistingDirectory (this,
00152                                             tr("Open Directory"),
00153                                             "/home",
00154                                             QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
00155 
00156   boost::filesystem::directory_iterator end_itr;
00157 
00158   if (boost::filesystem::is_directory (dir_.toStdString ()))
00159   {
00160     for (boost::filesystem::directory_iterator itr (dir_.toStdString ()); itr != end_itr; ++itr)
00161     {
00162       std::string ext = itr->path ().extension ().string ();
00163       if (ext.compare (".pcd") == 0)
00164       {
00165         pcd_files_.push_back (itr->path ().string ());
00166         pcd_paths_.push_back (itr->path ());
00167       }
00168       else
00169       {
00170         
00171         PCL_DEBUG ("[PCDVideoPlayer::selectFolderButtonPressed] : found a different file\n");
00172       }
00173     }
00174   }
00175   else
00176   {
00177     PCL_ERROR("Path is not a directory\n");
00178     exit(-1);
00179   }
00180   nr_of_frames_ = pcd_files_.size ();
00181   PCL_DEBUG ("[PCDVideoPlayer::selectFolderButtonPressed] : found %d files\n", nr_of_frames_ );
00182 
00183   if (nr_of_frames_ == 0)
00184   {
00185     PCL_ERROR ("Please select valid pcd folder\n");
00186     cloud_present_ = false;
00187     return;
00188   }
00189   else
00190   {
00191     
00192     ui_->indexSlider->setValue (0);                
00193     ui_->indexSlider->setRange (0, nr_of_frames_ - 1);  
00194 
00195     current_frame_ = 0;
00196 
00197     cloud_present_ = true;
00198     cloud_modified_ = true;
00199   }
00200 }
00201 
00202 void 
00203 PCDVideoPlayer::selectFilesButtonPressed ()
00204 {
00205   pcd_files_.clear ();  
00206   pcd_paths_.clear ();     
00207 
00208   QStringList qt_pcd_files = QFileDialog::getOpenFileNames (this,
00209                                                             "Select one or more PCD files to open",
00210                                                             "/home",
00211                                                             "PointClouds (*.pcd)");
00212   nr_of_frames_ = qt_pcd_files.size ();
00213   PCL_INFO ("[PCDVideoPlayer::selectFilesButtonPressed] : selected %ld files\n", nr_of_frames_);
00214 
00215   if (nr_of_frames_ == 0)
00216   {
00217     PCL_ERROR ("Please select valid pcd files\n");
00218     cloud_present_ = false;
00219     return;
00220   }
00221   else
00222   {
00223     for(int i = 0; i < qt_pcd_files.size (); i++)
00224     {
00225       pcd_files_.push_back (qt_pcd_files.at (i).toStdString ());
00226     }
00227 
00228     current_frame_ = 0;
00229 
00230     
00231     ui_->indexSlider->setValue (0);                
00232     ui_->indexSlider->setRange (0, nr_of_frames_ - 1);  
00233 
00234     cloud_present_ = true;
00235     cloud_modified_ = true;
00236   }
00237 }
00238 
00239 void 
00240 PCDVideoPlayer::timeoutSlot ()
00241 {
00242   if (play_mode_)
00243   {
00244     if (speed_counter_ == speed_value_)
00245     {
00246       if (current_frame_ == (nr_of_frames_-1)) 
00247       {
00248         current_frame_ = 0; 
00249       }
00250       else
00251       {
00252         current_frame_++;
00253         cloud_modified_ = true;
00254         ui_->indexSlider->setSliderPosition (current_frame_);        
00255       }
00256     }
00257     else
00258     {
00259       speed_counter_++;
00260     }
00261   }
00262 
00263   if (cloud_present_ && cloud_modified_)
00264   {
00265     if (pcl::io::loadPCDFile<pcl::PointXYZRGBA> (pcd_files_[current_frame_], *cloud_) == -1) 
00266     {
00267       PCL_ERROR ("[PCDVideoPlayer::timeoutSlot] : Couldn't read file %s\n");
00268     }
00269 
00270     if (!vis_->updatePointCloud(cloud_, "cloud_"))
00271     {
00272       vis_->addPointCloud (cloud_, "cloud_");
00273       vis_->resetCameraViewpoint("cloud_");
00274     }
00275     cloud_modified_ = false;
00276   }
00277   ui_->qvtkWidget->update ();
00278 }
00279 
00280 void
00281 PCDVideoPlayer::indexSliderValueChanged (int value)
00282 {
00283   PCL_DEBUG ("[PCDVideoPlayer::indexSliderValueChanged] : (I) : value %d\n", value);
00284   current_frame_ = value;
00285   cloud_modified_ = true;
00286 }
00287 
00288 void
00289 print_usage ()
00290 {
00291   PCL_INFO ("PCDVideoPlayer V0.1\n");
00292   PCL_INFO ("-------------------\n");
00293   PCL_INFO ("\tThe slider accepts focus on Tab and provides both a mouse wheel and a keyboard interface. The keyboard interface is the following:\n");
00294   PCL_INFO ("\t  Left/Right move a horizontal slider by one single step.\n");
00295   PCL_INFO ("\t  Up/Down move a vertical slider by one single step.\n");
00296   PCL_INFO ("\t  PageUp moves up one page.\n");
00297   PCL_INFO ("\t  PageDown moves down one page.\n");
00298   PCL_INFO ("\t  Home moves to the start (mininum).\n");
00299   PCL_INFO ("\t  End moves to the end (maximum).\n");
00300 }
00301 
00302 int
00303 main (int argc, char** argv)
00304 {
00305   QApplication app (argc, argv);
00306 
00307   PCDVideoPlayer VideoPlayer;
00308 
00309   VideoPlayer.show ();
00310 
00311   return (app.exec ());
00312 }