1.先将深度图转点云(点云的单位为米,记得转换单位)
原本平面
2.得到一个点云数据集:
pcl::PointCloud<pcl::PointXYZ>::Ptr Cloud(new pcl::PointCloud<pcl::PointXYZ>);
将点云数据集利用pcl自带的ransac函数拟合平面:
pcl::SACSegmentation<pcl::PointXYZ> seg;
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setMaxIterations(1000);迭代次数
seg.setDistanceThreshold(0.0001);内点
seg.setInputCloud(Cloud);
seg.segment(*inliers, *coefficients);
然后得到了coefficients;coefficients里面有四个参数:A\B\C\D
将原本的深度值z利用ABCD系数重新拟合:
float A = coefficients->values[0];
float B = coefficients->values[1];
float C = coefficients->values[2];
float D = coefficients->values[3];
cv::Mat plane_depth = cv::Mat::zeros(depth.size(), CV_32F);
for (int y = 0; y < depth.rows; ++y) {
for (int x = 0; x < depth.cols; ++x) {
float z = (D - A * x - B * y) / C;
plane_depth.at<float>(y, x) = z;
}
}
一个新的平面就拟合好了
拟合后平面