Я написал код для извлечения 3D-объектов из pointcloud
с использованием PCL
. Я использую Kd-tree
с облаком точек ввода и индексами, чтобы использовать его в качестве метода поиска для нормальной оценки. Все отлично работает , но при проверке утечек памяти с помощью valgrind
я получаю следующее предупреждение:
==29706== Memcheck, a memory error detector
==29706== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==29706== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==29706== Command: /home/inhands/Workspaces/objrecog_ws/devel/lib/objrecog_object_recognition/TrainingNode
==29706==
==29706== Conditional jump or move depends on uninitialised value(s)
==29706== at 0x135300D7: flann::KDTreeSingleIndex<flann::L2_Simple<float> >::divideTree(int, int, std::vector<flann::KDTreeSingleIndex<flann::L2_Simple<float> >::Interval, std::allocator<flann::KDTreeSingleIndex<flann::L2_Simple<float> >::Interval> >&) (in /usr/lib/x86_64-linux-gnu/libpcl_recognition.so.1.7.2)
==29706== by 0x13533A22: flann::KDTreeSingleIndex<flann::L2_Simple<float> >::buildIndexImpl() (in /usr/lib/x86_64-linux-gnu/libpcl_recognition.so.1.7.2)
==29706== by 0x1353793D: flann::NNIndex<flann::L2_Simple<float> >::buildIndex() (in /usr/lib/x86_64-linux-gnu/libpcl_recognition.so.1.7.2)
==29706== by 0x17762A18: pcl::KdTreeFLANN<pcl::PointXYZRGB, flann::L2_Simple<float> >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&) (in /usr/lib/x86_64-linux-gnu/libpcl_kdtree.so.1.7.2)
==29706== by 0x107275AA: pcl::search::KdTree<pcl::PointXYZRGB, pcl::KdTreeFLANN<pcl::PointXYZRGB, flann::L2_Simple<float> > >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&) (in /usr/lib/x86_64-linux-gnu/libpcl_search.so.1.7.2)
==29706== by 0x9027D90: FeatureExtraction3D::estimateNormals(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB> > const&, boost::shared_ptr<pcl::PointIndices> const&, boost::shared_ptr<pcl::PointCloud<pcl::Normal> >&) (feature_extraction_3d.cpp:30)
==29706== by 0x9027C1F: FeatureExtraction3D::computeFeatures(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB> > const&, boost::shared_ptr<pcl::PointIndices> const&, cv::Mat&) (feature_extraction_3d.cpp:19)
==29706== by 0x9245397: FeatureExtraction::extractFeatures(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZRGB> > const&, boost::shared_ptr<pcl::PointIndices> const&, cv::Mat&) (feature_extraction.cpp:28)
==29706== by 0x540813D: SVM::loadObjectSet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (svm_class.cpp:210)
==29706== by 0x5406609: SVM::train() (svm_class.cpp:64)
==29706== by 0x408FA7: objrecog_recognition_training::RecognitionTraining::trainAll() (objrecog_recognition_training_node.cpp:22)
==29706== by 0x409140: main (objrecog_recognition_training_node.cpp:48)
==29706== Uninitialised value was created by a stack allocation
==29706== at 0x17749BF3: int flann::get_param<int>(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, flann::any, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, flann::any> > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int const&) (in /usr/lib/x86_64-linux-gnu/libpcl_kdtree.so.1.7.2)
, который повторяется для каждого вызова divideTree()
. Похоже, это происходит только в начале программы, хотя для каждого нового ввода создается новое дерево. Интересно, это проблема моего кода или она взята из библиотеки FLANN
.
Код, который использует Kd-tree
, следующий:
FeatureExtraction - суперкласс
void
FeatureExtraction::extractFeatures(const pointCloud::Ptr & cloud,
const pointIndices::Ptr & indices,
cv::Mat & features)
{
// Compute Features
this->computeFeatures(cloud, indices, features);
}
FeatureExtraction3D - подкласс (computeFeatures - метод виртуального переопределения)
void
FeatureExtraction3D::computeFeatures(const pointCloud::Ptr & cloud,
const pointIndices::Ptr & indices,
cv::Mat & output_features)
{
normalCloud::Ptr cloud_normals (new normalCloud);
this->estimateNormals(cloud, indices, cloud_normals);
this->computeNormalHistogram(cloud_normals, output_features);
}
void
FeatureExtraction3D::estimateNormals(const pointCloud::Ptr & cloud,
const pointIndices::Ptr & indices,
normalCloud::Ptr & output_normals)
{
pcl::search::KdTree<point>::Ptr tree (new pcl::search::KdTree<point> ());
tree->setInputCloud(cloud, boost::make_shared<std::vector<int>>(indices->indices));
this->normal_estimation_.setInputCloud(cloud);
this->normal_estimation_.setIndices(indices);
this->normal_estimation_.setSearchMethod(tree);
this->normal_estimation_.setRadiusSearch (0.01);
this->normal_estimation_.useSensorOriginAsViewPoint();
this->normal_estimation_.compute(*output_normals);
}