#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);