Векторный итератор передан в ошибку функции

#c #vector #iterator #point-cloud-library

#c #вектор #итератор #точка-облако-библиотека

Вопрос:

Я хотел бы передать облако точек в качестве входного аргумента функции, предложенной библиотекой облака точек, но вот моя проблема: у меня есть вектор облака точек, и я хочу передавать их один за другим в фильтр, чтобы в конечном итоге поместить их в другой вектор отфильтрованного облака точек. Для этого я использую итератор, но функция, ожидающая облако точек в качестве входных данных, не принимает итератор… Я не понимаю, почему. Код:

 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> amp;,pcl::PointCloud<PointT> amp;,std::vector<int,std::allocator<_Ty>> amp;)' : could not deduce template argument for 'const pcl::PointCloud<PointT> amp;' from 'boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB>>'
 

А вот объявление pcl::removeNaNFromPointCloud:

 void pcl::removeNaNFromPointCloud   (
const pcl::PointCloud< PointT > amp;   cloud_in,
pcl::PointCloud< PointT > amp;     cloud_out,
std::vector< int > amp;    index 
)   
 

Не могли бы вы помочь мне в этом?
Спасибо

Комментарии:

1. 1. Отладчик не одобряет? Что это значит? Возможно, вы получаете ошибку компиляции? Если это так, опубликуйте полное сообщение об ошибке и строку, в которой оно встречается. 2. Пожалуйста, покажите объявление pcl::removeNaNFromPointCloud

2. Извините за отображение моего ответа, я не уверен, как подчеркнуть код…

3. Отредактируйте свой вопрос и добавьте сообщение об ошибке и укажите, на какую исходную строку он жалуется.

4. Спасибо, я только что это сделал

5. В сообщениях об ошибках указаны номера строк. Не опускайте их. Убедитесь, что опубликована строка-нарушитель, помеченная комментарием this is номер строки 12345 , и в сообщение включено достаточное количество исходных строк над ним, чтобы обеспечить контекст.

Ответ №1:

Из подписи функции вы можете видеть, что она ожидает ссылку на pcl::PointCloud< PointT > (я предполагаю, что это на самом деле шаблон функции и PointT является его параметром шаблона), но вы передаете a pcl::PointCloud<pcl::PointXYZRGB>::Ptr , полученный путем разыменования итератора. Вам также необходимо разыменовать указатель, чтобы получить доступ к объекту облака точек:

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