CentroidPoint<pcl::PointXYZ> centroid; centroid.add (pcl::PointXYZ (1, 2, 3); centroid.add (pcl::PointXYZ (5, 6, 7); //这里是在centroid点集中加两个点 pcl::PointXYZ c1; centroid.get (c1); //直接使用get函数获取该点集的在每一个字段的均值 // 获得的结果是: c1.x == 3, c1.y == 4, c1.z == 5 // 咱们也能够申明一个不同字段的点云来存储结果 pcl::PointXYZRGB c2; centroid.get (c2); // 其中x,y,z字段的结果仍是: c2.x == 3, c2.y == 4, c2.z == 5, // 可是 c2.rgb 是不被触及的
GlobalDescriptorsPtr global_descriptor; global_descriptor = computeGlobalDescriptor (cloud, normals); pcl::visualization::PCLHistogramVisualizer hist_vis; hist_vis.addFeatureHistogram (*global_descriptor, 308, "Global descriptor");
float* kernel_ptr_host; int kernel_size = 5; float sigma = 1.0; kernel_ptr_host = probability_processor_->CreateGaussianKernel(sigma, kernel_size);
pcl::PCA<pcl::PointXYZ> pca; pcl::PointXYZ projected, reconstructed; for(size_t i = 0; i < cloud.size(); i++) { pca.project (cloud[i], projected); pca.reconstruct (projected, reconstructed); }
inline float PiecewiseLinearFunction::getValue(float point) const { float vector_pos = factor_*point + offset_; float floored_vector_pos = floor(vector_pos); float interpolation_size = vector_pos-floored_vector_pos; int data_point_before = (std::max)(0, (std::min)(int(data_points_.size())-2, int(lrint(floored_vector_pos)))); //cout << "Interpolating between "<<data_point_before<<" and "<<data_point_before+1<<" with value " //<< interpolation_size<<" (vector size is "<<data_points_.size()<<").\n"; return data_points_[data_point_before]+interpolation_size*(data_points_[data_point_before+1]-data_points_[data_point_before]); }
PolynomialCalculationsT<RealForPolynomial> polynomial_calculations; BivariatePolynomialT<RealForPolynomial> polynomial (2); float interest_value2 = interest_image_[index2]; sample_points.push_back (Eigen::Vector3d (x2-keypoint_x_int, y2-keypoint_y_int, interest_value2)); polynomial_calculations.bivariatePolynomialApproximation (sample_points, 2, polynomial)
// Time measurements pcl::StopWatch sw; pcl::StopWatch sw_total; double t_select = 0.; double t_build = 0.; double t_nn_search = 0.; double t_calc_trafo = 0.; .... sw.reset (); ... t_select = sw.getTime (); sw.reset (); kd_tree_->setInputCloud (cloud_model_selected); t_build = sw.getTime (); ... t_nn_search += sw.getTime ();
{ pcl::ScopeTime t1 ("calculation"); // ... perform calculation here }
pcl::TransformationFromCorrespondences transformation_from_correspondeces; transformation_from_correspondeces.reset (); transformation_from_correspondeces.add (corr1, point1); transformation_from_correspondeces.add (corr2, point2); transformation_from_correspondeces.add (corr3, point3); transformation_from_correspondeces.add (corr4, point4); transformation_from_correspondeces.add (corr5, point5); transformation_from_correspondeces.add (corr6, point6); transformation_from_correspondeces.add (corr7, point7); transformation_from_correspondeces.add (corr8, point8); ++counter_for_added_pose_estimates; PoseEstimate pose_estimate; pose_estimate.transformation = transformation_from_correspondeces.getTransformation (); pose_estimate.score = 0.5f * (correspondence1.distance + correspondence2.distance); // TODO: base on the measured distance_errors? pose_estimate.correspondence_indices.push_back (correspondence1_idx); pose_estimate.correspondence_indices.push_back (correspondence2_idx); pose_estimates.push_back (pose_estimate);
VectorAverage3f vector_average; float max_dist_squared=max_dist*max_dist, max_dist_reciprocal=1.0f/max_dist; bool still_in_range = true; for (int radius=1; still_in_range; ++radius) { int x2=x-radius-1, y2=y-radius; // Top left - 1 still_in_range = false; for (int i=0; i<8*radius; ++i) { if (i<=2*radius) ++x2; else if (i<=4*radius) ++y2; else if (i<=6*radius) --x2; else --y2; if (!isValid (x2, y2)) { continue; } getPoint (x2, y2, neighbor); float distance_squared = (neighbor-point).squaredNorm (); if (distance_squared > max_dist_squared) { continue; } still_in_range = true; float distance = std::sqrt (distance_squared), weight = distance*max_dist_reciprocal; vector_average.add (neighbor, weight); } }
// Find Model-Scene Correspondences with KdTree // pcl::CorrespondencesPtr model_scene_corrs (new pcl::Correspondences ()); pcl::KdTreeFLANN<DescriptorType> match_search; match_search.setInputCloud (model_descriptors); // For each scene keypoint descriptor, find nearest neighbor into the model keypoints descriptor cloud and add it to the correspondences vector. for (size_t i = 0; i < scene_descriptors->size (); ++i) { std::vector<int> neigh_indices (1); std::vector<float> neigh_sqr_dists (1); if (!pcl_isfinite (scene_descriptors->at (i).descriptor[0])) //skipping NaNs { continue; } int found_neighs = match_search.nearestKSearch (scene_descriptors->at (i), 1, neigh_indices, neigh_sqr_dists); if(found_neighs == 1 && neigh_sqr_dists[0] < 0.25f) // add match only if the squared descriptor distance is less than 0.25 (SHOT descriptor distances are between 0 and 1 by design) { pcl::Correspondence corr (neigh_indices[0], static_cast<int> (i), neigh_sqr_dists[0]); model_scene_corrs->push_back (corr); } } std::cout << "Correspondences found: " << model_scene_corrs->size () << std::endl;
pcl::visualization::RangeImageVisualizer* pcl::visualization::RangeImageVisualizer::getInterestPointsWidget ( const pcl::RangeImage& range_image, const float* interest_image, float min_value, float max_value, const pcl::PointCloud<pcl::InterestPoint>& interest_points, const std::string& name) { RangeImageVisualizer* widget = new RangeImageVisualizer; widget->showFloatImage (interest_image, range_image.width, range_image.height, min_value, max_value); widget->setWindowTitle (name); for (unsigned int i=0; i<interest_points.points.size(); ++i) { const pcl::InterestPoint& interest_point = interest_points.points[i]; float image_x, image_y; range_image.getImagePoint (interest_point.x, interest_point.y, interest_point.z, image_x, image_y); widget->markPoint (static_cast<size_t> (image_x), static_cast<size_t> (image_y), green_color, red_color); } return widget; }
有兴趣的小伙伴能够关注微信公众号,加入QQ或者微信群,和你们一块儿交流分享吧git