向量迭代器传递给函数错误

时间:2014-06-26 11:17:09

标签: c++ vector iterator point-cloud-library

我想将点云作为输入参数传递给点云库提出的函数,但这是我的问题: 我有一个点云矢量,我想逐个将它们传递给过滤器,最终将它们放入另一个点云过滤矢量中。我正在使用迭代器,但是期望点云作为输入的函数不会使用迭代器...我不明白为什么。代码:

std::vector <pcl::PointCloud<pcl::PointXYZRGB>::Ptr> pcl_filter(std::vector <pcl::PointCloud<pcl::PointXYZRGB>::Ptr> rdy_to_pro_pcls){
    std::vector<int> indices;
    std::vector <pcl::PointCloud<pcl::PointXYZRGB>::Ptr>::iterator vIt_pcls = rdy_to_pro_pcls.begin();
    std::vector <pcl::PointCloud<pcl::PointXYZRGB>::Ptr> vFilt_pcls;
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr without_nanpcl(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr filt_pcl(new pcl::PointCloud<pcl::PointXYZRGB>);

    for (vIt_pcls = rdy_to_pro_pcls.begin(); vIt_pcls != rdy_to_pro_pcls.end(); vIt_pcls++){

        pcl::removeNaNFromPointCloud(*vIt_pcls, *without_nanpcl, indices);
        pcl::VoxelGrid<pcl::PointXYZRGB> sor;
        sor.setInputCloud(*vIt_pcls);
        sor.setLeafSize(0.01f, 0.01f, 0.01f);
        sor.filter(*filt_pcl);
        vFilt_pcls.push_back(filt_pcl);
    }
    return vFilt_pcls;
}

我实际上想将without_nanpcl对象放入向量中。因为我的调试器不能批准我正在做的事情,所以我无法继续前进。正如你在下面看到的那样,有一个名为setInputCloud的函数接受了向量迭代器,我想用pcl :: removeNaNFromPointCloud做同样的事情,但是我无法弄清楚它为什么不起作用。

这是错误输出(代码示例的第8行):

error C2784: 'void pcl::removeNaNFromPointCloud(const pcl::PointCloud<PointT> &,pcl::PointCloud<PointT> &,std::vector<int,std::allocator<_Ty>> &)' : could not deduce template argument for 'const pcl::PointCloud<PointT> &' from 'boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>>'

这是pcl :: removeNaNFromPointCloud声明:

void pcl::removeNaNFromPointCloud   (
const pcl::PointCloud< PointT > &   cloud_in,
pcl::PointCloud< PointT > &     cloud_out,
std::vector< int > &    index 
)   
你能帮我解决这个问题吗? 谢谢

1 个答案:

答案 0 :(得分:1)

从功能签名中,您可以看到它需要引用pcl::PointCloud< PointT >(我假设它实际上是一个功能模板而PointT是它的模板参数),但是你&#39 ;重新传入pcl::PointCloud<pcl::PointXYZRGB>::Ptr,通过解引用迭代器获得。您还需要取消引用指针以获取点云对象:

pcl::removeNaNFromPointCloud(**vIt_pcls, *without_nanpcl, indices);