資源簡介
基于PCL寫的一個刪除點云數據中的重復點的程序,也可以稍作修改刪除數組中的重復點。目前測試一個四千萬個點的點云數據,其中包含有一千萬個重復點,運行時間為50s。
文件中是源碼,其中包含CMakeLists.txt,可通過配置pcl后直接使用,也可直接復制代碼使用

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
int?numofPoints(const?char*?fname)?{
int?n?=?0;
int?c?=?0;
FILE?*fp;
fp?=?fopen(fname?“r“);
do?{
c?=?fgetc(fp);
if?(c?==?‘\n‘)?{
++n;
}
}?while?(c?!=?EOF);
fclose(fp);
return?n;
}
pcl::PointCloud?repeat_point_remove(pcl::PointCloud::Ptr?cloud_ptr)
{
srand(time(NULL));
time_t?begin?end;
begin?=?clock();//開始計時
pcl::KdTreeFLANN?kdtree;
kdtree.setInputCloud(cloud_ptr);
std::vector?pointIdxRadiusSearch;//進行r鄰域點搜索
std::vector?pointRadiusSquaredDistance;
std::vector?total_index;
float?radius?=?0.000001;//若兩點之間的距離為0.000001則認為是重合點
pcl::PointCloud::Ptr?repeat_cloud_ptr(new?pcl::PointCloud);
for?(int?i?=?0;?i?size();?++i)//對A中的每個點與B中點進行比較
{
if?(kdtree.radiusSearch(cloud_ptr->points[i]?radius?pointIdxRadiusSearch?pointRadiusSquaredDistance)?>?0)
{
if?(pointIdxRadiusSearch.size()?!=?1)//若某一點在0.000001領域內不止其本身一個點,則認為其有重復點
{
for?(size_t?j?=?1;?j? {
total_index.push_back(pointIdxRadiusSearch[j]);//將重復點的索引記錄下來,由于后續以此重復點為查詢點搜索時,此時這一點也會被定義為重復點,但pointIdxRadiusSearch中都是升序排列的,故從pointIdxRadiusSearch中的第二個點的索引開始記錄,這樣可以保證僅僅刪除重復的點,即會留一個
}
}
}
if?(i?%?1000000?==?0)
{
std::cout?< }
}
sort(total_index.begin()?total_index.end());//將索引進行排序
total_index.erase(unique(total_index.begin()?total_index.end())?total_index.end());//將索引中的重復索引去除
pcl::PointIndices::Ptr?outliners(new?pcl::PointIndices());//通過pcl中的extract類根據索引刪除點,則剩下的就不是重復點了
outliners->indices.resize(total_index.size());
for?(size_t?i?=?0;?i? {
outliners->indices[i]?=?total_index[i];
}
std::cout?<“total_index_getting?has?been?done“?< pcl::ExtractIndices?extract;
extract.setInputCloud(cloud_ptr);
extract.setIndices(outliners);
extract.setNegative(true);
extract.filter(*cloud_ptr);
std::cout?<“the?num?of?repeat?point?is:“?< std::cout?<“the?num?of?repeat?point?is:“?<points.size()?<
end?=?clock();//結束計時
double?Times?=?double(end?-?begin)?/?CLOCKS_PER_SEC;
std::cout?<“time:“?< return?*cloud_ptr;
}
int?main()
{
int?num_of_repeat_point?=?0;
int?n?=?0;?//n用來計文件中點個數
FILE?*fp_1;
fp_1?=?fopen(“import_test_without_normal.txt“?“r“);//輸入要讀取的文件名稱,下同
n?=?numofPoints(“import_test_without_normal.txt“);//使用numofPoints函數計算文件中點個數
std::cout?<“there?are?“?< pcl::PointCloud::Ptr?cloud_ptr(new?pcl::PointCloud);
double?x?y?z;
for?(unsigned?int?i?=?0;?i? {
fscanf(fp_1?“%lf?%lf?%lf
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????566??2019-08-06?21:06??source\CMakeLists.txt
?????文件????????3734??2019-08-06?21:30??source\main.cpp
?????目錄???????????0??2019-08-06?21:30??source\
- 上一篇:log4j.properties
- 下一篇:疫情地圖.zip
評論
共有 條評論