-
大小: 2KB文件類型: .zip金幣: 2下載: 0 次發(fā)布日期: 2021-06-04
- 語(yǔ)言: 其他
- 標(biāo)簽: Pcl??點(diǎn)云數(shù)據(jù)??
資源簡(jiǎn)介
基于PCL寫的一個(gè)刪除點(diǎn)云數(shù)據(jù)中的重復(fù)點(diǎn)的程序,也可以稍作修改刪除數(shù)組中的重復(fù)點(diǎn)。目前測(cè)試一個(gè)四千萬(wàn)個(gè)點(diǎn)的點(diǎn)云數(shù)據(jù),其中包含有一千萬(wàn)個(gè)重復(fù)點(diǎn),運(yùn)行時(shí)間為50s。
文件中是源碼,其中包含CMakeLists.txt,可通過(guò)配置pcl后直接使用,也可直接復(fù)制代碼使用

代碼片段和文件信息
#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();//開(kāi)始計(jì)時(shí)
pcl::KdTreeFLANN?kdtree;
kdtree.setInputCloud(cloud_ptr);
std::vector?pointIdxRadiusSearch;//進(jìn)行r鄰域點(diǎn)搜索
std::vector?pointRadiusSquaredDistance;
std::vector?total_index;
float?radius?=?0.000001;//若兩點(diǎn)之間的距離為0.000001則認(rèn)為是重合點(diǎn)
pcl::PointCloud::Ptr?repeat_cloud_ptr(new?pcl::PointCloud);
for?(int?i?=?0;?i?size();?++i)//對(duì)A中的每個(gè)點(diǎn)與B中點(diǎn)進(jìn)行比較
{
if?(kdtree.radiusSearch(cloud_ptr->points[i]?radius?pointIdxRadiusSearch?pointRadiusSquaredDistance)?>?0)
{
if?(pointIdxRadiusSearch.size()?!=?1)//若某一點(diǎn)在0.000001領(lǐng)域內(nèi)不止其本身一個(gè)點(diǎn),則認(rèn)為其有重復(fù)點(diǎn)
{
for?(size_t?j?=?1;?j? {
total_index.push_back(pointIdxRadiusSearch[j]);//將重復(fù)點(diǎn)的索引記錄下來(lái),由于后續(xù)以此重復(fù)點(diǎn)為查詢點(diǎn)搜索時(shí),此時(shí)這一點(diǎn)也會(huì)被定義為重復(fù)點(diǎn),但pointIdxRadiusSearch中都是升序排列的,故從pointIdxRadiusSearch中的第二個(gè)點(diǎn)的索引開(kāi)始記錄,這樣可以保證僅僅刪除重復(fù)的點(diǎn),即會(huì)留一個(gè)
}
}
}
if?(i?%?1000000?==?0)
{
std::cout?< }
}
sort(total_index.begin()?total_index.end());//將索引進(jìn)行排序
total_index.erase(unique(total_index.begin()?total_index.end())?total_index.end());//將索引中的重復(fù)索引去除
pcl::PointIndices::Ptr?outliners(new?pcl::PointIndices());//通過(guò)pcl中的extract類根據(jù)索引刪除點(diǎn),則剩下的就不是重復(fù)點(diǎn)了
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();//結(jié)束計(jì)時(shí)
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用來(lái)計(jì)文件中點(diǎn)個(gè)數(shù)
FILE?*fp_1;
fp_1?=?fopen(“import_test_without_normal.txt“?“r“);//輸入要讀取的文件名稱,下同
n?=?numofPoints(“import_test_without_normal.txt“);//使用numofPoints函數(shù)計(jì)算文件中點(diǎn)個(gè)數(shù)
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
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件?????????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
評(píng)論
共有 條評(píng)論