20200918:最近骨折了,很烦。蹦蹦跳跳的,膝盖疼。
一、RANSAC(Random Sample Consensus)
https://baike.baidu.com/item/ransac/10993469?fr=aladdin
(省的某些人嫌弃我不讲原理)
二、代码
分享给有需要的人,代码质量勿喷。
//Open3D
#include "Open3D/Open3D.h"
//Eigen
#include "Eigen/Dense"
/* RANSAC平面分割 */
void testOpen3D::pcPlaneRANSAC(const QString &pcPath)
{
int width = 700, height = 500;
auto cloud_ptr = std::make_shared<open3d::geometry::PointCloud>();
if (!open3d::io::ReadPointCloud(pcPath.toStdString(), *cloud_ptr)) { return; }
open3d::visualization::DrawGeometries({ cloud_ptr }, "Point Cloud 1", width, height);
/***** 距离阈值,平面最小点数,最大迭代次数。返回平面参数和内点 *****/
double tDis = 0.05;
int minNum = 3;
int numIter = 100;
std::tuple<Eigen::Vector4d, std::vector<size_t>> vRes = cloud_ptr->SegmentPlane(tDis, minNum, numIter);
//ABCD
Eigen::Vector4d para = std::get<0>(vRes);
//内点索引
std::vector<size_t> selectedIndex = std::get<1>(vRes);
//内点赋红色
std::shared_ptr<open3d::geometry::PointCloud> inPC = cloud_ptr->SelectByIndex(selectedIndex, false);
const Eigen::Vector3d colorIn = { 255,0,0 };
inPC->PaintUniformColor(colorIn);
//外点赋黑色
std::shared_ptr<open3d::geometry::PointCloud> outPC = cloud_ptr->SelectByIndex(selectedIndex, true);
const Eigen::Vector3d colorOut = { 0,0,0 };
outPC->PaintUniformColor(colorOut);
//显示
open3d::visualization::DrawGeometries({ inPC,outPC }, "RANSAC平面分割", width, height);
}
三、结果