FLANN Kd-дерево в PCL: Valgrind выдает предупреждение о неинициализированном значении - PullRequest
0 голосов
/ 25 марта 2019

Я написал код для извлечения 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);
}
...