2014-02-22 48 views
0

我是使用PCL(點雲庫)的新成員。我試圖聲明在QT對象類的點雲私有,這樣的:在QT對象類中聲明PCL點雲

class pcl_sys : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit pcl_sys(); 
    ~pcl_sys(); 
    void stop(); 
    bool load_pcd_file(int type); 

signals: 

public slots: 

protected: 
    void run(); 

private: 
    pcl::PointCloud<pcl::PointXYZ>::Ptr *cloud_test; 

}; 

然後我新的點雲,當我打開該程序:

pcl_sys::pcl_sys() 
{ 
    cloud_test=0; 
    cloud_test= new pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>); 
}  

,但是當我嘗試清除當我嘗試加載一個文件時,QT給我一個錯誤顯示點不屬於模板cloud_test。

bool pcl_sys::load_pcd_file(int choice) 
{ 

    cloud_test->points.clear(); 
} 

如何解決此問題?非常感謝你。

回答

1

他cloud_test是指向PointCloud :: Ptr類型的指針。所以你必須使用函數get()來訪問它的主體,然後通過它訪問它。

pcl::PointCloud<pcl::PointXYZ>::Ptr *cloud_test; 
cloud_test= new pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>); 
if (!cloud_test) cloud_test->get()->points.clear(); 

你也可以使用這個。在下文中,cloud_test是點雲:: PTR型(未引用指針):

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_test ; 
cloud_test = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>); 
cloud_test.get()->points.clear(); 

,也可以使用升壓:: shared_ptr的作爲指針,如下點雲:: PTR類型:

boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>::Ptr> cloud_test; 
cloud_test = boost::make_shared <pcl::PointCloud<pcl::PointXYZ>::Ptr> (new pcl::PointCloud<pcl::PointXYZ>); 
cloud_test->get()->points.clear(); 

:)

+0

還有一個問題,謝謝。它適用於'points.clear();'我有點搞砸了。我現在無法加載文件。 'pcl :: io :: loadPCDFile(fileName.toStdString(),cloud_test-> get() - > Ptr)' – KKyang

+0

注意轉換,如果你已經使用了'pcl :: PointCloud :: Ptr cloud_test;'然後你應該使用這樣的函數:'pcl :: io :: loadPCDFile(「o.pcd」,*(cloud_test-> get()));' –

+0

謝謝。我對這些類型搞砸了。 – KKyang

0

只是做cloud_test = new pcl::PointCloud<pcl::PointXYZ>,而不是創建一個新的指針PointCloud

+0

如果我將聲明和新點雲更改爲'pcl :: PointCloud ',我無法加載任何PCD文件,導致QT不會接受'cloud_test- > Ptr' – KKyang

+0

你的意思是我改變'cloud_test = new pcl :: PointCloud :: Ptr(new pcl :: PointCloud );'to'cloud_test = n ew pcl :: PointCloud '?它不工作,我正在使用QT 5.2.1和PCL 1.6.0 – KKyang