色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

點云濾波與匹配進階干貨收藏

新機器視覺 ? 來源:新機器視覺 ? 2023-11-06 11:03 ? 次閱讀

0. 簡介

之前作者專門為點云匹配寫了幾篇博客,但是我們發現最近幾年有更多的新方法已經在不斷地被使用。

同時之前有些內容也沒有很好的概括,所以這里我們將作為一篇進階文章來介紹這些方法的使用。

1. 地面點去除

處了使用一些復雜的方法(FEC)或是一些簡單的方法(根據高度來濾除)以外,還可以使用Ransac的方法完成平面擬合

#include 
#include 
#include 
#include 
#include 


void RemovePointsUnderGround(const pcl::PointCloud& cloud_in,
               pcl::PointCloud& cloud_out)
{
  // 對輸入點云進行降采樣
  pcl::PointCloud::Ptr cloud_downsampled(new pcl::PointCloud);
  pcl::VoxelGrid voxel_grid;
  voxel_grid.setInputCloud(cloud_in.makeShared());
  voxel_grid.setLeafSize(0.1f, 0.1f, 0.1f); // 設置體素格大小
  voxel_grid.filter(*cloud_downsampled);


  // 創建一個濾波器對象,用于提取地面平面
  pcl::PointCloud::Ptr cloud_filtered(new pcl::PointCloud);
  pcl::PassThrough pass_through;
  pass_through.setInputCloud(cloud_downsampled);
  pass_through.setFilterFieldName("z"); // 對z軸進行濾波
  pass_through.setFilterLimits(-1.5, 0.5); // 設置濾波范圍,過濾掉z軸在-1.5到0.5之間的點
  pass_through.filter(*cloud_filtered);


  // 創建一個分割對象,用于提取地面平面
  pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
  pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
  pcl::SACSegmentation segmentation;
  segmentation.setInputCloud(cloud_filtered);
  segmentation.setModelType(pcl::SACMODEL_PLANE);
  segmentation.setMethodType(pcl::SAC_RANSAC);
  segmentation.setDistanceThreshold(0.1); // 設置距離閾值,點到平面的距離小于該閾值的點將被認為是地面點
  segmentation.segment(*inliers, *coefficients);


  // 創建一個提取對象,用于提取地面點
  pcl::PointCloud::Ptr cloud_ground(new pcl::PointCloud);
  pcl::ExtractIndices extract;
  extract.setInputCloud(cloud_filtered);
  extract.setIndices(inliers);
  extract.setNegative(false); // 提取地面點,即保留inliers對應的點
  extract.filter(*cloud_ground);


  // 創建一個提取對象,用于提取非地面點
  pcl::PointCloud::Ptr cloud_non_ground(new pcl::PointCloud);
  extract.setNegative(true); // 提取非地面點,即去除inliers對應的點
  extract.filter(*cloud_non_ground);


  // 將結果保存到輸出點云中
  cloud_out = *cloud_non_ground;
}

2. PCA主成分判別

除了去除點云以外,還可以通過主成分判別來判斷我們分割的是否是地面。其中eigenvectors()函數得到的矩陣中的三個列向量分別對應于數據的主成分軸。

這些主成分軸是按照數據方差的降序排列的,即第一個列向量對應的是數據的第一主成分軸,第二個列向量對應的是數據的第二主成分軸,第三個列向量對應的是數據的第三主成分軸。對于PCA的特征值和特征向量可以從這里理解:

https://blog.csdn.net/lazysnake666/article/details/122404671

#include 
#include 
#include 
#include 


bool EstimatePlane(const pcl::PointCloud& cloud)
{


  // 將輸入點云數據轉換為PCL點云格式
  for (const auto& point : cloud)
  {
    pcl::PointXYZ pclPoint;
    pclPoint.x = point.x();
    pclPoint.y = point.y();
    pclPoint.z = point.z();
    cloud->push_back(pclPoint);
  }


  // 創建PCA對象
  pcl::PCA pca;
  pca.setInputCloud(cloud);


  // 計算主成分
  Eigen::Vector3f eigenValues = pca.getEigenValues();
  Eigen::Matrix3f eigenVectors = pca.getEigenVectors();


  // 獲取地面法向量,因為最小的就是第三列,所以最后一列是地面(0,0,1),如果是墻面那就(x,1-x,0)
  Eigen::Vector3f groundNormal = eigenVectors.col(2);#eigen_vector.block<3, 1>(0, 2)//最小成分的主成分向量,對應的是地面的法線,因為地面XY都存在比較大的主成分
  // 如果是其他的比如燈桿這種,一般的就會是fabs(eigen_vector.block<3, 1>(0, 0).dot(Eigen::UnitZ()))的形式,也就是最大主成分,沿著最大主成分方向


  bool is_ground = (fabs(groundNormal.dot(
               Eigen::UnitZ())) > 0.98) &&
             (eigenValues(2) < 0.05 * 0.05);//最小得列和地面法線重合|a||b|cos,并且eigenValues重要程度滿足要求,因為地面基本等于0,所以特征值也很小 ? https://blog.csdn.net/xinxiangwangzhi_/article/details/118228160
 ? ?// 如果是其他的比如燈桿這種,一般的就會是eigen_values(0) > 10 * eigen_values(1)


  return is_ground;
}

3. GICP配準

GICP配準這塊在之前的博客經典論文閱讀之-GICP(ICP大一統)中已經詳細講過了,下面就是一個示例代碼

Eigen::Matrix4d gicp_trans(
  pcl::PointCloud::Ptr source_cloud,
  pcl::PointCloud::Ptr target_cloud) {
 CHECK(source_cloud);
 CHECK(target_cloud);


 pcl::GeneralizedIterativeClosestPoint gicp;
 gicp.setInputSource(source_cloud);
 gicp.setInputTarget(target_cloud);




 gicp.setMaxCorrespondenceDistance(10.0);
 gicp.setMaximumIterations(100);
 gicp.setMaximumOptimizerIterations(100);
 gicp.setRANSACIterations(100);
 gicp.setRANSACOutlierRejectionThreshold(1.0);
 gicp.setTransformationEpsilon(0.01);
 gicp.setUseReciprocalCorespondences(false);


 LOG(INFO) << "MaxCorrespondenceDistance: " << gicp.getMaxCorrespondenceDistance();
 ?LOG(INFO) << "MaximumIterations: " << gicp.getMaximumIterations();
 ?LOG(INFO) << "MaximumOptimizerIterations: " << gicp.getMaximumOptimizerIterations();
 ?LOG(INFO) << "RANSACIterations: " << gicp.getRANSACIterations();
 ?LOG(INFO) << "RANSACOutlierRejectionThreshold: " << gicp.getRANSACOutlierRejectionThreshold();
 ?LOG(INFO) << "TransformationEpsilon: " << gicp.getTransformationEpsilon();
 ?LOG(INFO) << "MaxCorrespondenceDistance: " << gicp.getMaxCorrespondenceDistance();
 ?LOG(INFO) << "RANSACOutlierRejectionThreshold: " << gicp.getRANSACOutlierRejectionThreshold();
 ?LOG(INFO) << "UseReciprocalCorrespondences: " << gicp.getUseReciprocalCorrespondences();


 ?pcl::PointCloud::Ptr aligned_source =
   boost::make_shared>();
 gicp.align(*aligned_source);
 CHECK(aligned_source);
 LOG(INFO) << "Final transformation: " << std::endl << gicp.getFinalTransformation();
 ?if (gicp.hasConverged()) {
 ? ?LOG(INFO) << "GICP converged." << std::endl
 ? ? ? ? ? ? ?<< "The score is " << gicp.getFitnessScore();
 ?} else {
 ? ?LOG(INFO) << "GICP did not converge.";
 ?}


 ?LOG(INFO) << "Saving aligned source cloud to: " << params_.aligned_cloud_filename;
 ?pcl::savePCDFile(params_.aligned_cloud_filename, *aligned_source);


 ?return ?gicp.getFinalTransformation();
}

4. ikd-Tree配準

ikd-Tree的建圖配準離不開eskf的相關內容,相關的代碼太多了;所以這里大概整理了一下思路, 即導入地圖,然后將當前的點云與GPS結合轉到全局坐標系下,然后使用ikdtree完成檢索,并傳入ESKF中完成優化計算(如果點比較少還可以放棄ESKF,轉而用EstimatePlane來估算出平面,并利用點到平面的距離殘差來估算)

int feats_down_size = 0


esekfom::esekf kf;
state_ikfom state_point;
state_point = kf.get_x();
state_point.pos = Eigen::Vector3d(init_pos[0], init_pos[1], init_pos[2]);
Eigen::Quaterniond q(init_rot[3], init_rot[0], init_rot[1], init_rot[2]);
Sophus::SO3 SO3_q(q);
state_point.rot = SO3_q;
kf.change_x(state_point);
// IMU預積分部分(也可以用GPS代替IMU做積分)


//根據最新估計位姿 增量添加點云到map
void init_ikdtree(KD_TREE ikdtree)
{
  //加載讀取點云數據到cloud中
  string all_points_dir(string(string(ROOT_DIR) + "PCD/") + "GlobalMap_ikdtree.pcd");
  if (pcl::loadPCDFile(all_points_dir, *cloud) == -1)
  {
    PCL_ERROR("Read file fail!
");
  }


  ikdtree.set_downsample_param(filter_size_map_min);
  ikdtree.Build(cloud->points);
  std::cout << "---- ikdtree size: " << ikdtree.size() << std::endl;
}


void IkdTreeMapping(pcl::PointCloud::Ptr feats_undistort)//這個拿到的是轉到全局坐標系下去過噪聲的點
{
 KD_TREE ikdtree;
 if (ikdtree_.Root_Node == nullptr) {
  KD_TREE ikdtree;
 }
 pcl::VoxelGrid downSizeFilterSurf;
 downSizeFilterSurf.setLeafSize(0.5, 0.5, 0.5);
 //點云下采樣
 downSizeFilterSurf.setInputCloud(feats_undistort);
 PointCloudXYZI::Ptr feats_down_body(new PointCloudXYZI()); //畸變糾正后降采樣的單幀點云,lidar系
 downSizeFilterSurf.filter(*feats_down_body);
 feats_down_size = feats_down_body->points.size();


 // std::cout << "feats_down_size :" << feats_down_size << std::endl;
 ?if (feats_down_size < 5)
 ?{
 ? ? ?ROS_WARN("No point, skip this scan!
");
 ? ? ?return;
 ?}


 ?/*** iterated state estimation ***/
 ?Nearest_Points.resize(feats_down_size); //存儲近鄰點的vector
 ?kf.update_iterated_dyn_share_modified(0.001, feats_down_body, ikdtree, Nearest_Points, 4, true);#匹配相關的內容都在里面,核心就是ikdtree.Nearest_Search


 ?state_point = kf.get_x();
 ?pos_lid = state_point.pos + state_point.rot.matrix() * state_point.offset_T_L_I;
bainji :hf 

編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • gps
    gps
    +關注

    關注

    22

    文章

    2900

    瀏覽量

    166507
  • PCA
    PCA
    +關注

    關注

    0

    文章

    89

    瀏覽量

    29653

原文標題:點云濾波與匹配進階

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    立體視覺中誤匹配濾波方法的研究

    從二維空間和三維空間2種角度研究誤匹配濾波算法,提出在匹配前用于降低誤匹配的灰度預處理算法和一種基于真實控制的視差
    發表于 04-13 09:58 ?17次下載

    改進的特征匹配算法

    特征匹配是計算機視覺中的關鍵步驟,在很多領域中都有著的重要應用。通過對當前圖像特征匹配方法的研究,提取一種基于特征的灰度量和幾何特征量
    發表于 05-19 17:20 ?0次下載
    改進的特征<b class='flag-5'>點</b><b class='flag-5'>匹配</b>算法

    雙邊濾波去噪算法

    針對三維數據模型在去噪光順中存在不同尺度噪聲的問題,提出一種基于噪聲分類的雙邊濾波去噪算法。該算法首先將噪聲細分為大尺度和小尺度噪聲
    發表于 01-05 10:51 ?2次下載
    雙邊<b class='flag-5'>濾波</b><b class='flag-5'>點</b><b class='flag-5'>云</b>去噪算法

    SAW濾波匹配的目的和方法

    如何在電路板上安裝和匹配 SAW 濾波器,發揮SAW 濾波器的最佳性能,這對于應用SAW 濾波器的人員很重要,否則再好的產品也達不到使用者的要求。所以一般的 SAW
    的頭像 發表于 05-04 17:53 ?7249次閱讀
    SAW<b class='flag-5'>濾波</b>器<b class='flag-5'>匹配</b>的目的和方法

    無序抓取の3D匹配案例分享

    這是一個實際拍攝的云圖,經過了坐標系糾正變換,更方便查看點位置。里面有一塊平面就是我們需要匹配的目標點
    的頭像 發表于 09-24 11:39 ?3546次閱讀

    匹配與ICP算法基本思想

    ICP(Iterative Closest Point迭代最近)算法是一種集對集配準方法。如下圖所示,PR(紅色)和RB(藍色
    的頭像 發表于 09-24 12:43 ?3895次閱讀
    <b class='flag-5'>點</b><b class='flag-5'>云</b><b class='flag-5'>匹配</b>與ICP算法基本思想

    LabVIEW:適合平滑的雙邊濾波

    摘要: 我們通過掃描儀獲得物體的,經常摻雜著噪音。產生噪音的原因可能有很多多種,例如,切向的采集方向、環境光干擾、物體材質的反射等因素導致。因此設置一種濾波方法,可以去除噪音有保留物體原有物體
    的頭像 發表于 11-05 18:16 ?3525次閱讀
    LabVIEW:適合<b class='flag-5'>點</b><b class='flag-5'>云</b>平滑的雙邊<b class='flag-5'>濾波</b>器

    【CC2530授課筆記】課程列表匯總 【超級干貨】【建議收藏

    【CC2530授課筆記】課程列表匯總 【超級干貨】【建議收藏
    發表于 11-29 19:36 ?0次下載
    【CC2530授課筆記】課程列表匯總 【超級<b class='flag-5'>干貨</b>】【建議<b class='flag-5'>收藏</b>】

    SAW濾波器的使用和匹配

    如何在電路板上安裝和匹配 SAW 濾波器,發揮 SAW 濾波器的最佳性能,這對于應用 SAW 濾波器的人員很重要,為此我們介紹 SAW 濾波
    的頭像 發表于 10-08 16:03 ?3322次閱讀

    「實用干貨」7條實用的PCB布線規則,可收藏

    「實用干貨」7條實用的PCB布線規則,可收藏
    的頭像 發表于 02-01 08:36 ?1286次閱讀

    干貨 | 超實用總結,一文通吃所有整流濾波電路

    干貨 | 超實用總結,一文通吃所有整流濾波電路
    的頭像 發表于 03-23 21:19 ?1297次閱讀
    <b class='flag-5'>干貨</b> | 超實用總結,一文通吃所有整流<b class='flag-5'>濾波</b>電路

    SDMNet:大規模激光雷達配準的稀疏到稠密匹配網絡

    為了處理上述的問題,我們提出了SDMNet,一種新的由稀疏到密集的針對大規模室外的配準方法。稀疏到稠密匹配方案如圖1(c)所示。具體而言,我們將配準問題分為兩個階段,即稀疏匹配階段
    的頭像 發表于 05-24 15:53 ?1253次閱讀
    SDMNet:大規模激光雷達<b class='flag-5'>點</b><b class='flag-5'>云</b>配準的稀疏到稠密<b class='flag-5'>匹配</b>網絡

    干貨】推薦收藏!電力電子FPGA實時仿真技術淺析

    新秀!PPEC——你無法想象做電源竟如此簡單!●FPGA實時仿真天花板——NetBox電力電子仿真器●PPEC教你做電源——移相全橋電路原文標題:【干貨】推薦收藏
    的頭像 發表于 06-14 11:42 ?994次閱讀
    【<b class='flag-5'>干貨</b>】推薦<b class='flag-5'>收藏</b>!電力電子FPGA實時仿真技術淺析

    PCL匹配器濾除方法

    匹配器 2.1 ICP精配準 template typename PointCloudPtr > bool ex_segmentor::icp_registration
    的頭像 發表于 11-28 11:30 ?496次閱讀

    什么是匹配濾波器?如何理解匹配濾波器?

    [導讀]為增進大家對匹配濾波器的認識,本文將對匹配濾波器、匹配濾波器的詳細理解予以介紹。 匹配濾?波器作為濾波器的一種,在信號處理系統中發揮
    的頭像 發表于 01-12 08:39 ?1781次閱讀
    主站蜘蛛池模板: 亚洲成在人线视频| 福利一区国产| 亚洲午夜精品一区二区公牛电影院| 一本道dvd久久综合高清免费| 99RE6这里只有精品国产AV| 国产成人精品视频播放| 久久vs国产综合色| 天天干夜夜叭| 99久久免费精品国产| 国产精品一久久香蕉国产线看| 女人高潮久久久叫人喷水 | 恋夜影视列表免费安卓手机版| 日本调教网站| 在线精品视频免费观看| 国产偷国产偷亚洲高清app| 欧美高清videossexo| 野花日本手机观看大全免费3| 国产成人免费视频| 欧美黑人巨大videos免费| 一区在线观看在线| 国产人妻麻豆蜜桃色在线| 日本68xxxxxxxxx老师| 97人人添人人澡人人澡人人澡 | 青柠在线视频| 97亚洲狠狠色综合久久位| 99久久亚洲综合精品| 成人18视频在线观看| 毛片基地看看成人免费| 亚洲日本国产综合高清| 国产精品无码中文在线AV| 日本不卡不码高清免费| 99久久99久久久精品久久| 看看妇女的B免费看| 亚洲人成电影网站色2017| 国产日韩成人内射视频| 视频一区在线免费观看| 耽肉高h喷汁呻吟| 日韩毛片在线视频| 丰满老熟好大bbbxxx| 日韩中文亚洲欧美视频二| 啊…嗯啊好深男男高h文|