资源简介
对于霍夫直线一直是应用在图片中,因此此种方法可以应用在点云数据中。具体原理以及依赖的头文件和主函数见链接:https://mp.csdn.net/console/editor/html/106173138
数据部分见链接:
代码片段和文件信息
//HOUGH_LINE.cpp文件
#include “HOUGH_LINE.h“
HOUGH_LINE::HOUGH_LINE()
{
}
HOUGH_LINE::~HOUGH_LINE()
{
cloud->clear();
result_.clear();
}
void HOUGH_LINE::VoxelGrid_(float size_ PointCloud::Ptr &voxel_cloud) //定义降采样函数(常用略过)
{
PointCloud::Ptr tem_voxel_cloud(new PointCloud);
VoxelGrid vox;
vox.setInputCloud(cloud);
vox.setLeafSize(size_ size_ size_);
vox.filter(*tem_voxel_cloud);
cloud = tem_voxel_cloud;
voxel_cloud = tem_voxel_cloud;
point_num = cloud->size();
}
//在霍夫空间里边
void HOUGH_LINE::draw_hough_spacing() //定义绘制霍夫空间划分函数
{
visualization::PCLPlotter *plot_(new visualization::PCLPlotter(“My plotter“));//定义绘图对象
plot_->setBackgroundColor(1 1 1);//设置图形背景颜色(0,0,0)背景为黑色
plot_->settitle(“hough space“);//设置整体标题
plot_->setXtitle(“angle“);//设置X轴坐标标题记为角度
plot_->setYtitle(“rho“);//设置Y坐标标题记为ρ
vector>data_;//vector的元素类型是pair类型
double x_resolution1 = M_PI / 181;//1度=Π/180;1弧度=180/Π(横坐标轴从0到180一共181个数)
double a_1 b_1;//将降采样后点云数据的xy坐标赋值给a_1b_1
for (int i_point = 0; i_point < point_num; i_point++)
{
a_1 = cloud->points[i_point].x;
b_1 = cloud->points[i_point].y;
for (int i = 0; i < 181; i++)
{
data_.push_back(make_pair(i*x_resolution1 a_1 * cos(i*x_resolution1) + b_1 * sin(i*x_resolution1)));//data_的元素存储的是(θ,ρ)已知xyθ计算得到ρ
//访问(输出)存放在vector的成员(pair方式存在),便于观察理解
//cout << data_[i].first<<““ < }
plot_->addPlotData(data_ “line“ vtkChart::LINE);//XY均为double型的向量;第一个参数多项式或者要绘制的函数(点)、第二个曲线名称、第三个绘制线
data_.clear();
}
//plot_->setShowLegend(false);//不显示曲线名称(也就是对应上述addPlotData第二个参数)
plot_->setShowLegend(true);//显示曲线名称
plot_->plot();//绘制曲线
}
//寻找极大值(首先根据xy还有划分的0到180的θ,计算出每个xy点是落进哪个格子里边)
void HOUGH_LINE::HOUGH_line(int x_setp_num double y_resolution int grid_point_number_threshold vector&K_ vector&B_ int line_num)
{
vector>all_point_row_col;//所有的行列数
vector Grid_Index;
getMinMax3D(*cloud point_min point_max);//获取点云中的最大最小值XYZ
//观察一下输出的最大值xy分别是多少
//cout << “(“< double x_resolution = M_PI / x_setp_num;//Π/181(x轴的分辨率)
int raster_rows raster_cols;//栅格行,列
raster_rows = ceil((M_PI - 0) / x_resolution);//相当于等于x_setp_num=181
//查看一下输出的行有多少行
//cout << “行数:“<< raster_rows << endl;//181
raster_cols = ceil((point_max.y + point_max.x) / y_resolution) * 2;//y_resolution=0.5
//查看一下输出的列有多少列
//cout << “列数:“<< raster_cols << endl;//2970
MatrixXi all_row_col(raster_cols raster_rows);//存储每个格网内的个数 //是个矩阵raster_cols矩阵行数、 Xi表示元素是int类型?
all_row_col.setZero();//将这个表达式中所有数设为0
//查看一下这步定义的是啥?
//cout << “setZero之后的all_row_col:“ << all_row_col << endl;//输出全是0,(raster_cols raster_rows)这么多行列的0
//下边输出2970,181,537570
//cout << “all_row_col “ << “rows=“ << all_row_col.rows() << “cols=“ << all_row_col.cols() << “coefficeints=“ << all_row_col.size() << endl;
MatrixXd all_row_col_mean(raste
评论
共有 条评论