首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同的结果与pcl::MomentOfInertiaEstimation和pcl::CropBox?

不同的结果与pcl::MomentOfInertiaEstimation和pcl::CropBox?
EN

Stack Overflow用户
提问于 2017-11-24 04:05:14
回答 1查看 277关注 0票数 1

我试图从点云中得到一个OBB,使用pcl::MomentOfInertiaEstimation方法我得到了一个正确的结果,.I想用CropBox从OBB中提取点,但是我得到的点比原始的点云少得多,也许我的旋转向量有问题:v,我不确定。有谁可以帮我?

代码语言:javascript
复制
struct BoundingBox{ 
        pcl::PointXYZ min_point_OBB; 
        pcl::PointXYZ max_point_OBB; 
        pcl::PointXYZ position_OBB; 
        Eigen::Matrix3f rotational_matrix_OBB; 
        pcl::PointXYZ center; 
        pcl::PointXYZ x_axis; 
        pcl::PointXYZ y_axis; 
        pcl::PointXYZ z_axis; 

}; 
BoundingBox getOBB(pcl::PointCloud<pcl::PointXYZ>::Ptr  cloud,BoundingBox OBB ) 
{ 
  pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor; 
  feature_extractor.setInputCloud (cloud); 
  feature_extractor.compute (); 
  feature_extractor.getOBB (OBB.min_point_OBB, OBB.max_point_OBB, OBB.position_OBB, OBB.rotational_matrix_OBB); 
 return OBB; 
}   

int main(void){ 
BoundingBox OBB; 
OBB=getOBB(Npoints,OBB);                   //Npoints is a part of the whole cloud 
Eigen::Quaternionf quat (OBB.rotational_matrix_OBB); 
Eigen::Vector3f position (OBB.position_OBB.x, OBB.position_OBB.y, OBB.position_OBB.z); 
 pcl::visualization::PCLVisualizer viewer; 
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> points_color_handler (cloud, 255, 255, 255); 
 viewer.addCube (position, quat, OBB.max_point_OBB.x - OBB.min_point_OBB.x, OBB.max_point_OBB.y - OBB.min_point_OBB.y, OBB.max_point_OBB.z - OBB.min_point_OBB.z,"OBB"); 
viewer.setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME,"OBB"); 
////////////////above result is correct//////////////////// 
 Eigen::Vector4f max_point_OBB(OBB.max_point_OBB.x,OBB.max_point_OBB.y,OBB.max_point_OBB.z,1.0); 
Eigen::Vector4f min_point_OBB(OBB.min_point_OBB.x,OBB.min_point_OBB.y,OBB.min_point_OBB.z,1.0); 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut (new pcl::PointCloud<pcl::PointXYZ>); 
pcl::CropBox<pcl::PointXYZ> boxfilter; 
boxfilter.setMax(max_point_OBB);         
boxfilter.setMin(min_point_OBB); 
Eigen::Vector3f v = quat.vec(); 
boxfilter.setTranslation(position); 
boxfilter.setRotation(v); 
boxfilter.setInputCloud(cloud); 
boxfilter.filter (*cloudOut); 
 /////////cloulOut includes much less points than Npoints///////// 

寻找答案!

EN

回答 1

Stack Overflow用户

发布于 2022-09-06 11:45:46

代码语言:javascript
复制
//boxfilter.setTranslation(position);
//boxfilter.setRotation(v);

Eigen::Translation3f translation(position_OBB.x, position_OBB.y, position_OBB.z);
Eigen::Matrix3f rotationMatrixOOB = quat.toRotationMatrix();
Eigen::Affine3f affine3f = translation * rotational_matrix_OBB;
boxfilter.setTransform(affine3f.inverse());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47466220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档