2012-01-25 38 views
12

RGB ve Derinlik verileri üzerinde bazı işlemler yapıyorum ve görselleştirilecek bulut noktaları oluşturuyorum, şu anda PCL Visualizer kullanıyorum ve iyi çalışıyor. Görselleştiriciyi farklı bir iş parçacığına sahip olmak istiyorum (böylece gerçek bulut noktasını yeniden çizecek şekilde gerçek zamanlı olarak çalışıyorum. İletileri hızlandırmayı denedim ancak bir çalışma zamanı hatası alıyorum "VTK hatalı arama tablosu"PCL kullanarak Bulut Nokta Görselleştirme Akışı

Akışını nasıl görselleştireceğini herkes bilir ? farklı bir iş parçacığı bulut noktaları

cevap

7

Tamam, ben boost konuları ve mutex kullanarak bunu nasıl yaptığını burada, daha önce yanlış belki de yaptım, şimdi çalışmak için bir şey var

bool update; 
    boost::mutex updateModelMutex; 
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>); 

    void visualize() 
    { 
     // prepare visualizer named "viewer" 

     while (!viewer->wasStopped()) 
     { 
      viewer->spinOnce (100); 
      // Get lock on the boolean update and check if cloud was updated 
      boost::mutex::scoped_lock updateLock(updateModelMutex); 
      if(update) 
      { 
       if(!viewer->updatePointCloud(cloud, "sample cloud")) 
        viewer->addPointCloud(cloud, colorHandler, "sample cloud"); 
       update = false; 
      } 
      updateLock.unlock(); 

     } 
    } 


    int main() 
    { 
     //Start visualizer thread 
     boost::thread workerThread(visualize); 

     while(notFinishedProcessing) 
     { 
      boost::mutex::scoped_lock updateLock(updateModelMutex); 
      update = true; 
      // do processing on cloud 
      updateLock.unlock(); 

     } 
     workerThread.join(); 
    } 

GÜNCELLEME:

t'ye göre onun page Onun nedeni, görselleştiriciye boş bir nokta bulutu eklemenin şeylerin çıldırmasına neden olduğu için kodu

+0

Hi khaled! Yani, farklı bir iş parçacığında çalışan ve iyi çalışan bir virüsten mi? PCLVisualizer doxy belgelerinde şunu buldum: 'Bu sınıf çoklu iş parçacıklarında KULLANILAMAZ. Yalnızca bu sınıftaki nesnelerin işlevlerini oluşturuldukları aynı iş parçacığından çağırın! Bazı yöntemler, ör. addPointCloud, diğer thread'lardan çağrılırsa çökecektir. Görüntüleyicinin başka bir iş parçacığında çalışmasını gerçekten istiyorum, lütfen. Yaklaşımınızın çalıştığını söyleyebilir misiniz? : D –

+1

evet bu aslında işe yarıyor. Dokümanlar hala doğru, yalnızca başka bir iş parçacığından değil, görselleştirmenin iş parçasından 'addPointCloud 'gibi yöntemleri çağırmalısınız. Bu nedenle, görselleştirme döngüsünüz farklı bir iş parçacığındaysa, ana yöntemden 'addPointCloud' diyemezsiniz. – Khaled

+0

Teşekkürler. Bunu hemen deneyeceğim! –