国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析

這篇具有很好參考價(jià)值的文章主要介紹了[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

寫在前面

跨域描述符LCD可以實(shí)現(xiàn)二維圖片特征點(diǎn)到三維點(diǎn)云特征點(diǎn)的配準(zhǔn),是個(gè)具有通用性的深度學(xué)習(xí)特征描述子。(圖片來源于論文LCD: Learned Cross-Domain Descriptors for 2D-3D Matching
在Github開源的源碼里面給出了利用LCD進(jìn)行三維點(diǎn)云配準(zhǔn)的例程。align_point_cloud.py,這里對例程如何使用已經(jīng)訓(xùn)練好的模型來進(jìn)行三維點(diǎn)云配準(zhǔn)進(jìn)行解析。

運(yùn)行環(huán)境

python版本3.6.0以上
pytorch非CPU版本(可選)
Open3D
numpy及其它庫,自行下載
需要注意的是,官方的源碼中使用的Open3D版本較舊,在運(yùn)行程序時(shí)回出現(xiàn)新版本對應(yīng)函數(shù)不匹配的報(bào)錯(cuò),詳情可以參考我之前發(fā)的解決辦法。

順帶一提,例程是不能在pycharm里面直接運(yùn)行的,需要輸入?yún)?shù),具體是啥參照官方Github里面給的:

Aligning two point clouds with LCD This demo aligns two 3D colored
point clouds using our pre-trained LCD descriptor with RANSAC. How to
run:

$ python -m apps.align_point_cloud samples/000.ply samples/002.ply --logdir logs/LCD-D256/
For more information, use the --help option.

在代碼的根目錄下運(yùn)行python -m apps.align_point_cloud samples/000.ply samples/002.ply --logdir logs/LCD-D256/即可運(yùn)行調(diào)試。在pycharm里面需要帶參數(shù)運(yùn)行,具體方法自行搜索。

正文

1.庫

把該用的庫引一引:

import os
import json
import open3d
import torch
import argparse
import numpy as np

from lcd.models import *

但是pycharm提示我這個(gè)例程里面似乎并沒有用到pytorch,刪了也能正常運(yùn)行。

這部分里面的from lcd.models import * 對應(yīng)的lcd.models文件夾下有[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析
patchnet和pointnet兩種分別對應(yīng)了二維和三維描述子生成網(wǎng)絡(luò),例程中使用了pointnet下的PointNetAutoencoder類,之后會展開說說。

2.參數(shù)輸入和模型建立

parser = argparse.ArgumentParser()
parser.add_argument("source", help="path to the source point cloud")
parser.add_argument("target", help="path to the target point cloud")
parser.add_argument("--logdir", help="path to the log directory")
parser.add_argument("--voxel_size", default=0.1, type=float)
parser.add_argument("--radius", default=0.15, type=float)
parser.add_argument("--num_points", default=1024, type=int)
args = parser.parse_args()

(1) source → 輸入點(diǎn)云路徑
(2) target → 目標(biāo)點(diǎn)云路徑
(3) --logdir → 模型文件路徑
(4) --voxel_size → 體素大小,默認(rèn)為0.1
(5) --radius → 最近鄰搜索半徑,默認(rèn)為0.15
(6) --num_points → 采樣點(diǎn)對應(yīng)patch內(nèi)特征點(diǎn)個(gè)數(shù),默認(rèn)為1024

得到輸入args為:
[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析

接著是讀取網(wǎng)絡(luò)配置文件config.json

logdir = args.logdir
config = os.path.join(logdir, "config.json")
config = json.load(open(config))

device = config["device"]

logdir 是 Log/LCD-D256目錄,保存了訓(xùn)練好的模型和配置等:

[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析
接下來

fname = os.path.join(logdir, "model.pth")
print("> Loading model from {}".format(fname))
model = PointNetAutoencoder(
    config["embedding_size"],
    config["input_channels"],
    config["output_channels"],
    config["normalize"],
)
model.load_state_dict(torch.load(fname)["pointnet"])
model.to(device)
model.eval()

fname為模型文件model.pth的路徑
我們來看一下 PointNetAutoencoder類的輸入[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析
程序這邊model直接和config保持了一致。
在獲得配置文件后進(jìn)行模型加載:

model.load_state_dict(torch.load(fname)["pointnet"])

fname路徑對應(yīng)的model文件里面有 pointnet 和 patchnet 兩批參數(shù),這邊因?yàn)橹挥悬c(diǎn)云的網(wǎng)絡(luò)所以只需要讀取[“pointnet”]。

model.to(device)

將模型加載在配置讀取出來的設(shè)備上(GPU)

model.eval()

eval()挺重要的,在模型預(yù)測階段我們需要Dropout層和batch normalization層設(shè)置到預(yù)測模式。

3.extract_uniform_patches

定義函數(shù)extract_uniform_patches,獲得點(diǎn)云Patch。

def extract_uniform_patches(pcd, voxel_size, radius, num_points):
    kdtree = open3d.geometry.KDTreeFlann(pcd)
    downsampled = pcd.voxel_down_sample(voxel_size)
    points = np.asarray(downsampled.points)
    patches = []
    for i in range(points.shape[0]):
        k, index, _ = kdtree.search_hybrid_vector_3d(points[i], radius, num_points)
        if k < num_points:
            index = np.random.choice(index, num_points, replace=True)
        xyz = np.asarray(pcd.points)[index]
        rgb = np.asarray(pcd.colors)[index]
        xyz = (xyz - points[i]) / radius  # normalize to local coordinates
        patch = np.concatenate([xyz, rgb], axis=1)
        patches.append(patch)
    patches = np.stack(patches, axis=0)
    return downsampled, patches

輸入pcd, voxel_size, radius, num_points

kdtree = open3d.geometry.KDTreeFlann(pcd)
downsampled = pcd.voxel_down_sample(voxel_size)
points = np.asarray(downsampled.points)

kdtree一會最近鄰搜索用的;
對點(diǎn)云進(jìn)行體素降采樣得到downsampled,是一個(gè)Open3D點(diǎn)云對象;
得到采樣點(diǎn)points。

 patches = []
    for i in range(points.shape[0]):
        k, index, _ = kdtree.search_hybrid_vector_3d(points[i], radius, num_points)
        if k < num_points:
            index = np.random.choice(index, num_points, replace=True)
        xyz = np.asarray(pcd.points)[index]
        rgb = np.asarray(pcd.colors)[index]
        xyz = (xyz - points[i]) / radius  # normalize to local coordinates
        patch = np.concatenate([xyz, rgb], axis=1)
        patches.append(patch)
    patches = np.stack(patches, axis=0)
    return downsampled, patche

最近鄰搜索kdtree.search_hybrid_vector_3d對每個(gè)降采樣之后的點(diǎn)進(jìn)行最近鄰搜索。
返回一個(gè)Tuple[int, open3d.utility.IntVector, open3d.utility.DoubleVector],程序中的K為搜索點(diǎn)的個(gè)數(shù),index為搜索點(diǎn)對應(yīng)的索引,是個(gè)一維數(shù)組。

后面的

 if k < num_points:
            index = np.random.choice(index, num_points, replace=True)

是當(dāng)k的值小于給定目標(biāo)點(diǎn)的個(gè)數(shù)(1024)時(shí)將進(jìn)行隨機(jī)填充,將index填充到目標(biāo)長度。

xyz = np.asarray(pcd.points)[index]
rgb = np.asarray(pcd.colors)[index]

取xyz為采樣點(diǎn)的位置信息,rgb為采樣點(diǎn)的顏色信息。

xyz = (xyz - points[i]) / radius

點(diǎn)云位置歸一化處理。

		patch = np.concatenate([xyz, rgb], axis=1)
        patches.append(patch)
    patches = np.stack(patches, axis=0)

將位置和顏色信息合并,對所有采樣點(diǎn)處理完畢后將列表patches堆疊為一個(gè)[points.shape[0], num_points, 6](例程中為[1469, 1024, 6])維度的矩陣。

return downsampled, patches

返回值為Open3D點(diǎn)云對象downsampled和patches??梢钥闯龊瘮?shù)功能就是將輸入的點(diǎn)云降采樣并得到所有采樣點(diǎn)對應(yīng)的patch。

4.compute_lcd_descriptors

計(jì)算LCD特征描述子

def compute_lcd_descriptors(patches, model, batch_size, device):
    batches = torch.tensor(patches, dtype=torch.float32)
    batches = torch.split(batches, batch_size)
    descriptors = []
    with torch.no_grad():
        for i, x in enumerate(batches):
            x = x.to(device)
            z = model.encode(x)
            z = z.cpu().numpy()
            descriptors.append(z)
    return np.concatenate(descriptors, axis=0)

輸入為生成的patch和model以及選擇參數(shù)batch_size(例程中為128)、device(例程中為CUDA)。

batches = torch.tensor(patches, dtype=torch.float32)
batches = torch.split(batches, batch_size)

將輸入的patch轉(zhuǎn)換為張量并將生成的張量按照batch_size進(jìn)行分割。例程中的batch為若干(128, 1024, 6)的張量塊。

	with torch.no_grad():
        for i, x in enumerate(batches):
            x = x.to(device)
            z = model.encode(x)
            z = z.cpu().numpy()
            descriptors.append(z)

只是想看一下訓(xùn)練的效果,并不是想通過驗(yàn)證集來更新網(wǎng)絡(luò)時(shí),可以使用with torch.no_grad()。
對于z = model.encode(x),在類PointNetAutoencoder中有:

    def encode(self, x):
        z = self.encoder(x)
        if self.normalize:
            z = F.normalize(z)
        return z

然后pointnet.py前面有寫

self.normalize = normalize
self.input_channels = input_channels
self.embedding_size = embedding_size
self.encoder = PointNetEncoder(embedding_size, input_channels)

其中類PointNetEncoder如下:

class PointNetEncoder(nn.Module):
    def __init__(self, embedding_size, input_channels=3):
        super(PointNetEncoder, self).__init__()
        self.input_channels = input_channels
        self.stn1 = STN3D(input_channels)
        self.stn2 = STN3D(64)
        self.mlp1 = nn.Sequential(
            nn.Conv1d(input_channels, 64, 1),
            nn.BatchNorm1d(64),
            nn.ReLU(),
            nn.Conv1d(64, 64, 1),
            nn.BatchNorm1d(64),
            nn.ReLU(),
        )
        self.mlp2 = nn.Sequential(
            nn.Conv1d(64, 64, 1),
            nn.BatchNorm1d(64),
            nn.ReLU(),
            nn.Conv1d(64, 128, 1),
            nn.BatchNorm1d(128),
            nn.ReLU(),
            nn.Conv1d(128, 1024, 1),
            nn.BatchNorm1d(1024),
            nn.ReLU(),
        )
        self.fc = nn.Linear(1024, embedding_size)

正是訓(xùn)練得到的三維點(diǎn)云編碼器模型,得到一個(gè)CUDA tensor格式的數(shù)據(jù)、

z = z.cpu().numpy()

先將其轉(zhuǎn)換成cpu float-tensor隨后再轉(zhuǎn)到numpy格式。 numpy不能讀取CUDA tensor 需要將它轉(zhuǎn)化為 CPU tensor,得到一個(gè)(128,256)的描述子矩陣。

return np.concatenate(descriptors, axis=0)

將得到的所有描述子堆疊后輸出,例程中的輸出格式為(1469,256)。

5.點(diǎn)云讀取與處理

source = open3d.io.read_point_cloud(args.source)
target = open3d.io.read_point_cloud(args.target)

讀取源點(diǎn)云和目標(biāo)點(diǎn)云。

source_points, source_patches = extract_uniform_patches(
    source, args.voxel_size, args.radius, args.num_points)

通過exract_uniform_patches得到降采樣后的源點(diǎn)云和其對應(yīng)的patch。

source_descriptors = compute_lcd_descriptors(
    source_patches, model, batch_size=128, device=device)

通過compute_lcd_descriptors得到源點(diǎn)云的特征描述子source_descriptors。

source_features = open3d.pipelines.registration.Feature()
source_features.data = np.transpose(source_descriptors)  # T
print("Extracted {} features from source".format(len(source_descriptors)))

open3d.pipelines.registration.Feature()在官方文檔中的解釋如下:
[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析

大概可以理解為在Open3D的piplines里面用于儲存用于配準(zhǔn)的特征數(shù)據(jù)的類,需要將生成的特征描述子轉(zhuǎn)置后賦給source_features中的data——source_features.data = np.transpose(source_descriptors)

目標(biāo)點(diǎn)云的處理方式一致:

target_points, target_patches = extract_uniform_patches(
    target, args.voxel_size, args.radius, args.num_points
)
target_descriptors = compute_lcd_descriptors(
    target_patches, model, batch_size=128, device=device
)
target_features = open3d.pipelines.registration.Feature()
target_features.data = np.transpose(target_descriptors)
print("Extracted {} features from target".format(len(target_descriptors)))

6. 特征點(diǎn)配準(zhǔn)

threshold = 0.075
result = open3d.pipelines.registration.registration_ransac_based_on_feature_matching(
    source_points,
    target_points,
    source_features,
    target_features,
    True,
    threshold,
    open3d.pipelines.registration.TransformationEstimationPointToPoint(False),
    4,
    [open3d.pipelines.registration.CorrespondenceCheckerBasedOnDistance(threshold)],
    open3d.pipelines.registration.RANSACConvergenceCriteria(4000000, 500),
)

注意:這部分的代碼是在新版本Open3D的基礎(chǔ)上修改的,并非原代碼。
修改原因見我之前發(fā)的Open3D 15.1 報(bào)錯(cuò) module ‘open3d‘ has no attribute ‘registration‘(跑LCD代碼時(shí)報(bào)錯(cuò))
open3d.pipelines.registration.registration_ransac_based_on_feature_matching函數(shù)新版本官方給出的解釋如下:
[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析
對兩點(diǎn)云進(jìn)行特征配準(zhǔn)得到結(jié)果result,

if result.transformation.trace() == 4.0:
    success = False

當(dāng)變換矩陣的跡為4時(shí)(沒有產(chǎn)生旋轉(zhuǎn))認(rèn)定未完成配準(zhǔn)。

information = open3d.pipelines.registration.get_information_matrix_from_point_clouds(
    source_points, target_points, threshold, result.transformation
)
n = min(len(source_points.points), len(target_points.points))
if (information[5, 5] / n) < 0.3:  # overlap threshold
    success = False

通過獲得信息矩陣來判定是否配準(zhǔn)成功。

if not success:
    print("Cannot align two point clouds")
    exit(0)

如果配準(zhǔn)未成功,直接結(jié)束程序。

print("Success!")
print("Visualizing alignment result...")
source.estimate_normals(open3d.geometry.KDTreeSearchParamHybrid(radius=0.2, max_nn=30))
target.estimate_normals(open3d.geometry.KDTreeSearchParamHybrid(radius=0.2, max_nn=30))
source.paint_uniform_color([1, 0.706, 0])
target.paint_uniform_color([0, 0.651, 0.929])
source.transform(result.transformation)
open3d.visualization.draw_geometries([source, target])
print(result.transformation)

如果配準(zhǔn)成功完成,將配準(zhǔn)后的點(diǎn)云變換后著色進(jìn)行可視化輸出得到如下結(jié)果:
[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析文章來源地址http://www.zghlxwxcb.cn/news/detail-481623.html

到了這里,關(guān)于[點(diǎn)云配準(zhǔn)]LCD(2D-3D特征配準(zhǔn)算法)例程align_point_cloud.py解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • CVPR2023新作:3D點(diǎn)云配準(zhǔn)--3D Registration with Maximal Cliques

    Title: 3D Registration with Maximal Cliques Affiliation: School of Computer Science, Northwestern Polytechnical University, China Authors: Xiyu Zhang, Jiaqi Yang, Shikun Zhang, Yanning Zhang Keywords: 3D point cloud registration, maximal cliques, graph theory, SVD algorithm, deep learning Summary: (1): 本文主要解決3D點(diǎn)云配準(zhǔn)的問題,并針對現(xiàn)有

    2024年02月15日
    瀏覽(26)
  • 多視圖點(diǎn)云配準(zhǔn)算法綜述

    多視圖點(diǎn)云配準(zhǔn)算法綜述

    作者:楊佳琪,張世坤,范世超等 轉(zhuǎn)載自:華中科技大學(xué)學(xué)報(bào)(自然科學(xué)版) 編輯:東岸因?yàn)锧一點(diǎn)人工一點(diǎn)智能 原文:??多視圖點(diǎn)云配準(zhǔn)算法綜述?? 摘要: 以多視圖點(diǎn)云配準(zhǔn)為研究對象,對近二十余年的多視圖點(diǎn)云配準(zhǔn)相關(guān)研究工作進(jìn)行了全面的分類歸納及總結(jié)。首先

    2024年02月05日
    瀏覽(24)
  • 激光雷達(dá)點(diǎn)云基礎(chǔ)-點(diǎn)云濾波算法與點(diǎn)云配準(zhǔn)算法

    激光雷達(dá)點(diǎn)云基礎(chǔ)-點(diǎn)云濾波算法與點(diǎn)云配準(zhǔn)算法

    激光雷達(dá)點(diǎn)云處理在五年前就做了較多的工作,最近有一些新的接觸發(fā)現(xiàn)激光雷達(dá)代碼原理五年前未見重大更新,或許C++與激光雷達(dá)結(jié)合本身就是比較高的技術(shù)門檻。深度學(xué)習(xí)調(diào)包俠在硬核激光雷達(dá)技術(shù)面前可以說是完全的自愧不如啊。 1、點(diǎn)云濾波 在獲取點(diǎn)云數(shù)據(jù)時(shí),由于

    2024年03月19日
    瀏覽(58)
  • open3d點(diǎn)云配準(zhǔn)函數(shù)registration_icp

    open3d點(diǎn)云配準(zhǔn)函數(shù)registration_icp

    open3d快速上手 ICP, 即Iterative Closest Point, 迭代點(diǎn)算法。 ICP算法有多種形式,其中最簡單的思路就是比較點(diǎn)與點(diǎn)之間的距離,對于點(diǎn)云 P = { p i } , Q = { q i } P={p_i}, Q={q_i} P = { p i ? } , Q = { q i ? } 而言,如果二者是同一目標(biāo),通過旋轉(zhuǎn)、平移等操作可以實(shí)現(xiàn)重合的話,那么只需

    2023年04月19日
    瀏覽(24)
  • 基于深度學(xué)習(xí)方法的點(diǎn)云算法1——PointNetLK(點(diǎn)云配準(zhǔn))

    基于深度學(xué)習(xí)方法的點(diǎn)云算法1——PointNetLK(點(diǎn)云配準(zhǔn))

    請點(diǎn)點(diǎn)贊,會持續(xù)更新?。?! 基于深度學(xué)習(xí)方法的點(diǎn)云算法2——PointNet(點(diǎn)云分類分割) 基于深度學(xué)習(xí)方法的點(diǎn)云算法3——PointNet++(點(diǎn)云分類分割) 基于深度學(xué)習(xí)方法的點(diǎn)云算法4——PCT: Point Cloud Transformer(點(diǎn)云分類分割) 作者將PointNet看成一個(gè)可學(xué)習(xí)的成像函數(shù)(learn

    2024年02月10日
    瀏覽(27)
  • 點(diǎn)云配準(zhǔn)的傳統(tǒng)算法ICP與NDT概述

    點(diǎn)云配準(zhǔn)的傳統(tǒng)算法ICP與NDT概述

    公眾號致力于分享點(diǎn)云處理,SLAM,三維視覺,高精地圖相關(guān)的文章與技術(shù),歡迎各位加入我們,一起交流一起進(jìn)步,有興趣的可聯(lián)系微信:920177957。 本文來自點(diǎn)云PCL博主的分享,未經(jīng)作者允許請勿轉(zhuǎn)載,歡迎各位同學(xué)積極分享和交流。 什么是點(diǎn)云配準(zhǔn) 點(diǎn)云配準(zhǔn)是指將多個(gè)點(diǎn)

    2024年02月05日
    瀏覽(30)
  • 【PCL】—— 點(diǎn)云配準(zhǔn)ICP(Iterative Closest Point)算法

    【PCL】—— 點(diǎn)云配準(zhǔn)ICP(Iterative Closest Point)算法

    ? ????由于三維掃描儀設(shè)備受到測量方式和被測物體形狀的條件限制,一次掃描往往只能獲取到局部的點(diǎn)云信息,進(jìn)而需要進(jìn)行多次掃描,然后每次掃描時(shí)得到的點(diǎn)云都有獨(dú)立的坐標(biāo)系,不可以直接進(jìn)行拼接。在逆向工程、計(jì)算機(jī)視覺、文物數(shù)字化等領(lǐng)域中,由于點(diǎn)云的

    2024年02月13日
    瀏覽(34)
  • 點(diǎn)云配準(zhǔn)--對稱式ICP

    點(diǎn)云配準(zhǔn)--對稱式ICP

    對稱式ICP 針對于局部平面不完美的情況,提出了一種對稱式ICP目標(biāo)函數(shù),相較于傳統(tǒng)的ICP方法,增大了收斂域,提高了收斂速度。論文理論說明不甚清楚,實(shí)驗(yàn)較少,但代碼開源。 對稱目標(biāo)函數(shù) 在icp中對于一對對應(yīng)點(diǎn)p,q:在點(diǎn)到法線的度量中: ( p ? q ) ? n q (3) (p-q) cd

    2024年02月06日
    瀏覽(26)
  • 2D-3D配準(zhǔn)指南[方法匯總]【入門指導(dǎo)向】(一)問題介紹+LCD跨域描述子+Triplet loss

    2D-3D配準(zhǔn)指南[方法匯總]【入門指導(dǎo)向】(一)問題介紹+LCD跨域描述子+Triplet loss

    近年來,采用三維和二維數(shù)據(jù)的應(yīng)用層出不窮,它們都需要將 三維模型 與 二維圖像 進(jìn)行匹配。大型定位識別系統(tǒng)可以估算出照片拍攝的位置。在全球定位系統(tǒng)可能失靈的情況下,地理定位系統(tǒng)可以進(jìn)行地點(diǎn)識別,對自動駕駛非常有用。此外,法醫(yī)警察也可以利用該系統(tǒng)破案

    2024年02月03日
    瀏覽(21)
  • 點(diǎn)云配準(zhǔn)--gicp原理與其在pcl中的使用

    點(diǎn)云配準(zhǔn)--gicp原理與其在pcl中的使用

    總結(jié):gicp引入了概率信息(使用協(xié)方差陣),提出了icp的統(tǒng)一模型,既可以解釋點(diǎn)到點(diǎn)和點(diǎn)到面的icp,也在新模型理論的基礎(chǔ)上,提出了一種面到面的icp。 論文原文:《Generalized-ICP》 在概率模型中假設(shè)存在配準(zhǔn)中兩個(gè)點(diǎn)集, A ^ = { a i ^ } hat{A}=left{hat{a_{i}}right} A ^ = { a i ?

    2024年01月19日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包