点云库:计算筛选关键点 - 输入云错误
PointCloud library: Compute sift keypoints - input cloud error
我正在尝试用这个计算输入云的筛选关键点法典:
#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/range_image/range_image.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/features/range_image_border_extractor.h>
#include <pcl/keypoints/narf_keypoint.h>
#include <pcl/features/narf_descriptor.h>
#include <pcl/console/parse.h>
#include <pcl/point_types.h>
#include <pcl/features/pfh.h>
#include <pcl/kdtree/kdtree.h>
#include <pcl/surface/gp3.h>
#include <pcl/features/spin_image.h>
#include <cmath>
#include <pcl/registration/icp.h>
#include <pcl/keypoints/sift_keypoint.h>
void processSift (std::string filename, std::string filename2){
// ------------------------------------------------------------------
// -----Read ply file-----
// ------------------------------------------------------------------
pcl::PointCloud<PointType>::Ptr cloud_xyz_ptr(
new pcl::PointCloud<PointType>);
pcl::PointCloud<PointType>& cloud_xyz = *cloud_xyz_ptr;
if (pcl::io::loadPLYFile(filename, cloud_xyz) == -1) {
cerr << "Was not able to open file "" << filename << "".n";
printUsage("");
}
// Parameters for sift computation
const float min_scale = 0.01f;
const int n_octaves = 3;
const int n_scales_per_octave = 4;
const float min_contrast = 0.001f;
pcl::SIFTKeypoint<PointType, pcl::PointWithScale> sift;
pcl::search::KdTree<PointType> tree= new pcl::search::KdTree<PointType> ();//new API
pcl::PointCloud<pcl::PointWithScale>::Ptr sifts (new
pcl::PointCloud<pcl::PointWithScale>);
pcl::KdTree<PointType>::PointCloudConstPtr ptr_sift_cloud(&cloud_xyz);
sift.setInputCloud(ptr_sift_cloud);
//sift.setSearchMethod (tree);
sift.setScales(min_scale, n_octaves, n_scales_per_octave);
sift.setMinimumContrast(min_contrast);
sift.compute (*sifts);
cout << "Computed " << (*sifts).size () << " SIFT Keypoints";
现在问题出在 sift 键点类内部,因为看起来 PointXYZ 没有名为"强度"的参数。
In file included from
/home/adrian/PointCloudComparator/src/comparator.cpp:21:0:
/usr/include/pcl-1.7/pcl/keypoints/sift_keypoint.h: In instantiation of
‘float pcl::SIFTKeypointFieldSelector<PointT>::operator()(const PointT&)
const [with PointT = pcl::PointXYZ]’:
/usr/include/pcl-1.7/pcl/keypoints/impl/sift_keypoint.hpp:236:82: required
from ‘void pcl::SIFTKeypoint<PointInT, PointOutT>::computeScaleSpace(const
PointCloudIn&, pcl::SIFTKeypoint<PointInT, PointOutT>::KdTree&, const
std::vector<float>&, Eigen::MatrixXf&) [with PointInT = pcl::PointXYZ;
PointOutT = pcl::PointWithScale; pcl::SIFTKeypoint<PointInT,
PointOutT>::PointCloudIn = pcl::PointCloud<pcl::PointXYZ>;
pcl::SIFTKeypoint<PointInT, PointOutT>::KdTree =
pcl::search::Search<pcl::PointXYZ>; Eigen::MatrixXf = Eigen::Matrix<float,
-1, -1>]’
/usr/include/pcl-1.7/pcl/keypoints/impl/sift_keypoint.hpp:163:56: required
from ‘void pcl::SIFTKeypoint<PointInT,
PointOutT>::detectKeypointsForOctave(const PointCloudIn&,
pcl::SIFTKeypoint<PointInT, PointOutT>::KdTree&, float, int,
pcl::SIFTKeypoint<PointInT, PointOutT>::PointCloudOut&) [with PointInT =
pcl::PointXYZ; PointOutT = pcl::PointWithScale; pcl::SIFTKeypoint<PointInT,
PointOutT>::PointCloudIn = pcl::PointCloud<pcl::PointXYZ>;
pcl::SIFTKeypoint<PointInT, PointOutT>::KdTree =
pcl::search::Search<pcl::PointXYZ>; pcl::SIFTKeypoint<PointInT,
PointOutT>::PointCloudOut = pcl::PointCloud<pcl::PointWithScale>]’
/usr/include/pcl-1.7/pcl/keypoints/impl/sift_keypoint.hpp:139:83: required
from ‘void pcl::SIFTKeypoint<PointInT,
PointOutT>::detectKeypoints(pcl::SIFTKeypoint<PointInT,
PointOutT>::PointCloudOut&) [with PointInT = pcl::PointXYZ; PointOutT =
pcl::PointWithScale; pcl::SIFTKeypoint<PointInT, PointOutT>::PointCloudOut =
pcl::PointCloud<pcl::PointWithScale>]’
/home/adrian/PointCloudComparator/src/comparator.cpp:340:1: required from here
/usr/include/pcl-1.7/pcl/keypoints/sift_keypoint.h:49:16: error: ‘const
struct pcl::PointXYZ’ has no member named ‘intensity’
return p.intensity;
如果我想筛选 PointXYZ 值的关键点,我应该使用什么?
实际上,问题是我正在使用 pcl::P ointXYZ,并且存在一个类型 pcl::P ointXYZRGB。这个具有属性强度(颜色(,现在它可以工作,只需将每个"PointType"更改为"PointXYZRGB">
相关文章:
- 堆栈中大小变量输入错误 (C++)
- 如果用户没有输入任何内容或输入错误,如何重新输入用户的输入?
- 如何从标准输入中检测格式化输入错误?
- 如何在没有打印语句的情况下报告用户输入错误
- 用户输入错误
- 按下Enter时如何输入错误消息,但没有给出任何答案
- 在我的IF-ELSE循环中输入错误
- C++ 输入错误
- C++ 函数输入错误
- 使用ifstreamwhile循环,如何显示输入错误并在下一行继续
- switch 语句中的输入错误 如何循环回第一种情况?C++
- 在 switch 语句中输入字符以进行C++时用户输入错误
- 如果我输入错误的 dos 命令,shellexecute 会给出正确的结果
- C++输入错误的数组
- scanf和多个输入错误
- C++输入浮点而不是整数时的输入错误
- 使用字符串流和if-else语句时发生字符串输入错误
- 当用户输入错误输入时,一次清除 cin 中的整行而不是一个字符
- setw() 在包含 UTF-8 多字节字符/码位的字符串上输入错误的输出
- c++中的getline输入错误