欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

點(diǎn)云濾波與匹配進(jìn)階干貨收藏

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

0. 簡介

之前作者專門為點(diǎn)云匹配寫了幾篇博客,但是我們發(fā)現(xiàn)最近幾年有更多的新方法已經(jīng)在不斷地被使用。

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

1. 地面點(diǎn)去除

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

#include 
#include 
#include 
#include 
#include 


void RemovePointsUnderGround(const pcl::PointCloud& cloud_in,
               pcl::PointCloud& cloud_out)
{
  // 對輸入點(diǎn)云進(jìn)行降采樣
  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); // 設(shè)置體素格大小
  voxel_grid.filter(*cloud_downsampled);


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


  // 創(chuàng)建一個(gè)分割對象,用于提取地面平面
  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); // 設(shè)置距離閾值,點(diǎn)到平面的距離小于該閾值的點(diǎn)將被認(rèn)為是地面點(diǎn)
  segmentation.segment(*inliers, *coefficients);


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


  // 創(chuàng)建一個(gè)提取對象,用于提取非地面點(diǎn)
  pcl::PointCloud::Ptr cloud_non_ground(new pcl::PointCloud);
  extract.setNegative(true); // 提取非地面點(diǎn),即去除inliers對應(yīng)的點(diǎn)
  extract.filter(*cloud_non_ground);


  // 將結(jié)果保存到輸出點(diǎn)云中
  cloud_out = *cloud_non_ground;
}

2. PCA主成分判別

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

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

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

#include 
#include 
#include 
#include 


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


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


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


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


  // 獲取地面法向量,因?yàn)樽钚〉木褪堑谌?,所以最后一列是地面?,0,1),如果是墻面那就(x,1-x,0)
  Eigen::Vector3f groundNormal = eigenVectors.col(2);#eigen_vector.block<3, 1>(0, 2)//最小成分的主成分向量,對應(yīng)的是地面的法線,因?yàn)榈孛鎄Y都存在比較大的主成分
  // 如果是其他的比如燈桿這種,一般的就會(huì)是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重要程度滿足要求,因?yàn)榈孛婊镜扔?,所以特征值也很小 ? https://blog.csdn.net/xinxiangwangzhi_/article/details/118228160
 ? ?// 如果是其他的比如燈桿這種,一般的就會(huì)是eigen_values(0) > 10 * eigen_values(1)


  return is_ground;
}

3. GICP配準(zhǔn)

GICP配準(zhǔn)這塊在之前的博客經(jīng)典論文閱讀之-GICP(ICP大一統(tǒng))中已經(jīng)詳細(xì)講過了,下面就是一個(gè)示例代碼

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配準(zhǔn)

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

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預(yù)積分部分(也可以用GPS代替IMU做積分)


//根據(jù)最新估計(jì)位姿 增量添加點(diǎn)云到map
void init_ikdtree(KD_TREE ikdtree)
{
  //加載讀取點(diǎn)云數(shù)據(jù)到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)//這個(gè)拿到的是轉(zhuǎn)到全局坐標(biāo)系下去過噪聲的點(diǎn)
{
 KD_TREE ikdtree;
 if (ikdtree_.Root_Node == nullptr) {
  KD_TREE ikdtree;
 }
 pcl::VoxelGrid downSizeFilterSurf;
 downSizeFilterSurf.setLeafSize(0.5, 0.5, 0.5);
 //點(diǎn)云下采樣
 downSizeFilterSurf.setInputCloud(feats_undistort);
 PointCloudXYZI::Ptr feats_down_body(new PointCloudXYZI()); //畸變糾正后降采樣的單幀點(diǎn)云,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); //存儲(chǔ)近鄰點(diǎn)的vector
 ?kf.update_iterated_dyn_share_modified(0.001, feats_down_body, ikdtree, Nearest_Points, 4, true);#匹配相關(guān)的內(nèi)容都在里面,核心就是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 

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • gps
    gps
    +關(guān)注

    關(guān)注

    22

    文章

    2903

    瀏覽量

    166852
  • PCA
    PCA
    +關(guān)注

    關(guān)注

    0

    文章

    90

    瀏覽量

    29713

原文標(biāo)題:點(diǎn)云濾波與匹配進(jìn)階

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    改進(jìn)的特征點(diǎn)匹配算法

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

    雙邊濾波點(diǎn)去噪算法

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

    SAW濾波匹配的目的和方法

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

    無序抓取の3D點(diǎn)匹配案例分享

    這是一個(gè)實(shí)際拍攝的點(diǎn)云圖,經(jīng)過了坐標(biāo)系糾正變換,更方便查看點(diǎn)位置。里面有一塊平面就是我們需要匹配的目標(biāo)點(diǎn)
    的頭像 發(fā)表于 09-24 11:39 ?3583次閱讀

    點(diǎn)匹配與ICP算法基本思想

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

    LabVIEW:適合點(diǎn)平滑的雙邊濾波

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

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

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

    SAW濾波器的使用和匹配

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

    「實(shí)用干貨」7條實(shí)用的PCB布線規(guī)則,可收藏

    「實(shí)用干貨」7條實(shí)用的PCB布線規(guī)則,可收藏
    的頭像 發(fā)表于 02-01 08:36 ?1313次閱讀

    干貨 | 超實(shí)用總結(jié),一文通吃所有整流濾波電路

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

    SDMNet:大規(guī)模激光雷達(dá)點(diǎn)配準(zhǔn)的稀疏到稠密匹配網(wǎng)絡(luò)

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

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

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

    PCL匹配器濾除點(diǎn)方法

    匹配器 2.1 ICP點(diǎn)精配準(zhǔn) template typename PointCloudPtr > bool ex_segmentor::icp_registration
    的頭像 發(fā)表于 11-28 11:30 ?517次閱讀

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

    [導(dǎo)讀]為增進(jìn)大家對匹配濾波器的認(rèn)識,本文將對匹配濾波器、匹配濾波器的詳細(xì)理解予以介紹。 匹配濾?波器作為濾波器的一種,在信號處理系統(tǒng)中發(fā)揮
    的頭像 發(fā)表于 01-12 08:39 ?1869次閱讀