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

Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)

這篇具有很好參考價(jià)值的文章主要介紹了Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??畢設(shè)需要,復(fù)現(xiàn)一下PointNet++的對象分類、零件分割和場景分割,找點(diǎn)靈感和思路,做個踩坑記錄。

下載代碼

https://github.com/yanx27/Pointnet_Pointnet2_pytorch
??我的運(yùn)行環(huán)境是pytorch1.7+cuda11.0。

訓(xùn)練

??PointNet++代碼能實(shí)現(xiàn)3D對象分類、對象零件分割和語義場景分割。

對象分類

??下載數(shù)據(jù)集ModelNet40,并存儲在文件夾data/modelnet40_normal_resampled/。

## e.g., pointnet2_ssg without normal features
python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg
python test_classification.py --log_dir pointnet2_cls_ssg

## e.g., pointnet2_ssg with normal features
python train_classification.py --model pointnet2_cls_ssg --use_normals --log_dir pointnet2_cls_ssg_normal
python test_classification.py --use_normals --log_dir pointnet2_cls_ssg_normal

## e.g., pointnet2_ssg with uniform sampling
python train_classification.py --model pointnet2_cls_ssg --use_uniform_sample --log_dir pointnet2_cls_ssg_fps
python test_classification.py --use_uniform_sample --log_dir pointnet2_cls_ssg_fps
  • 主文件夾下運(yùn)行代碼python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg時(shí)可能會報(bào)錯:
    ImportError: cannot import name 'PointNetSetAbstraction'
    原因是pointnet2_cls_ssg.py文件import時(shí)的工作目錄時(shí)models文件夾,但是實(shí)際運(yùn)行的工作目錄時(shí)models的上級目錄,因此需要在pointnet2_cls_ssg.py里把from pointnet2_utils import PointNetSetAbstraction改成from models.pointnet2_utils import PointNetSetAbstraction

??參考README.md文件,分類不是我的主攻點(diǎn),這里就略過了。

零件分割

??零件分割是將一個物體的各個零件分割出來,比如把椅子的椅子腿分出來。
??下載數(shù)據(jù)集ShapeNet,并存儲在文件夾data/shapenetcore_partanno_segmentation_benchmark_v0_normal/
??運(yùn)行也很簡單:

## e.g., pointnet2_msg
python train_partseg.py --model pointnet2_part_seg_msg --normal --log_dir pointnet2_part_seg_msg
python test_partseg.py --normal --log_dir pointnet2_part_seg_msg

??shapenet數(shù)據(jù)集txt文件格式:前三個點(diǎn)是xyz,點(diǎn)云的位置坐標(biāo),后三個點(diǎn)是點(diǎn)云的法向信息,最后一個點(diǎn)是這個點(diǎn)所屬的小類別,即1表示所屬50個小類別中的第一個。

??寫個代碼用open3d可視化shapenet數(shù)據(jù)集的txt文件(隨機(jī)配色):

import open3d as o3d
import numpy as np
'''
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.dirname(BASE_DIR)
sys.path.append(BASE_DIR)
sys.path.append(os.path.join(ROOT_DIR, 'data_utils'))
'''
 
txt_path = '/home/lin/CV_AI_learning/Pointnet_Pointnet2_pytorch-master/data/shapenetcore_partanno_segmentation_benchmark_v0_normal/02691156/1b3c6b2fbcf834cf62b600da24e0965.txt'
# 通過numpy讀取txt點(diǎn)云
pcd = np.genfromtxt(txt_path, delimiter=" ")
 
pcd_vector = o3d.geometry.PointCloud()
# 加載點(diǎn)坐標(biāo)
# txt點(diǎn)云前三個數(shù)值一般對應(yīng)x、y、z坐標(biāo),可以通過open3d.geometry.PointCloud().points加載
# 如果有法線或顏色,那么可以分別通過open3d.geometry.PointCloud().normals或open3d.geometry.PointCloud().colors加載
pcd_vector.points = o3d.utility.Vector3dVector(pcd[:, :3])
pcd_vector.colors = o3d.utility.Vector3dVector(pcd[:, 3:6])
o3d.visualization.draw_geometries([pcd_vector])

??GPU內(nèi)存不夠減小一下batch_size。
??我這里訓(xùn)練了一下,接著代碼的best_model.pth繼續(xù)訓(xùn)練150輪,RTX3080單顯卡訓(xùn)練一輪得六七分鐘,150輪花了半天多的時(shí)間。
??網(wǎng)上的代碼基本test一下分割的一些參數(shù)就結(jié)束了,沒有做可視化,參考這篇blog做了一下結(jié)果的可視化:PointNet++分割預(yù)測結(jié)果可視化。這篇blog首先用網(wǎng)絡(luò)將輸入圖像的預(yù)測結(jié)果存為txt文件,然后用Matplotlib做可視化,過程有點(diǎn)復(fù)雜了,用open3d做可視化比較簡潔一點(diǎn),代碼如下:

import tqdm
import matplotlib
import torch
import os
import warnings
import numpy as np
import open3d as o3d
from torch.utils.data import Dataset
import pybullet as p
from models.pointnet2_part_seg_msg import get_model as pointnet2
import time

warnings.filterwarnings('ignore')
matplotlib.use("Agg")
def pc_normalize(pc):
    centroid = np.mean(pc, axis=0)
    pc = pc - centroid
    m = np.max(np.sqrt(np.sum(pc ** 2, axis=1)))
    pc = pc / m
    return pc,centroid,m

def generate_pointcloud(color_image, depth_image,width=1280,height=720,fov=50,near=0.01,far=5):
    rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(color_image, depth_image,convert_rgb_to_intensity=False)
    intrinsic = o3d.camera.PinholeCameraIntrinsic(o3d.camera.PinholeCameraIntrinsicParameters.Kinect2DepthCameraDefault )

    aspect = width / height

    projection_matrix = p.computeProjectionMatrixFOV(fov, aspect, near, far)
    intrinsic.set_intrinsics(width=width, height=height, fx=projection_matrix[0]*width/2, fy=projection_matrix[5]*height/2, cx=width/2, cy=height/2)
    point_cloud = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, intrinsic)
    
    point_cloud.estimate_normals( search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))
    return point_cloud

class PartNormalDataset(Dataset):
    def __init__(self, point_cloud, npoints=2500, normal_channel=False):
        self.npoints = npoints # 采樣點(diǎn)數(shù)
        self.cat = {}
        self.normal_channel = normal_channel # 是否使用法向信息

        position_data = np.asarray(point_cloud.points)
        normal_data = np.asarray(point_cloud.normals)
        self.raw_pcd = np.hstack([position_data,normal_data]).astype(np.float32)

        self.cat = {'board':'12345678'}
        # 輸出的是元組,('Airplane',123.txt)

        self.classes = {'board': 0} 

        data = self.raw_pcd

        if not self.normal_channel:  # 判斷是否使用法向信息
            self.point_set = data[:, 0:3]
        else:
            self.point_set = data[:, 0:6]

        self.point_set[:, 0:3],self.centroid,self.m = pc_normalize(self.point_set[:, 0:3]) # 做一個歸一化

        choice = np.random.choice(self.point_set.shape[0], self.npoints, replace=True) # 對一個類別中的數(shù)據(jù)進(jìn)行隨機(jī)采樣 返回索引,允許重復(fù)采樣
        # resample
        self.point_set =  self.point_set[choice, :] # 根據(jù)索引采樣

    def __getitem__(self, index):

        cat = list(self.cat.keys())[0]
        cls = self.classes[cat] # 將類名轉(zhuǎn)換為索引
        cls = np.array([cls]).astype(np.int32)

        return self.point_set, cls, self.centroid, self.m # pointset是點(diǎn)云數(shù)據(jù),cls十六個大類別,seg是一個數(shù)據(jù)中,不同點(diǎn)對應(yīng)的小類別

    def __len__(self):
        return 1



class Generate_txt_and_3d_img:
    def __init__(self,num_classes,testDataLoader,model,visualize = False):
        self.testDataLoader = testDataLoader
        self.num_classes = num_classes
        self.heat_map = False # 控制是否輸出heatmap
        self.visualize = visualize # 是否open3d可視化
        self.model = model

        self.generate_predict()
        self.o3d_draw_3d_img()

    def __getitem__(self, index):
        return self.predict_pcd_colored

    def generate_predict(self):

        for _, (points, label,centroid,m) in tqdm.tqdm(enumerate(self.testDataLoader),
                                                                      total=len(self.testDataLoader),smoothing=0.9):

            #點(diǎn)云數(shù)據(jù)、整個圖像的標(biāo)簽、每個點(diǎn)的標(biāo)簽、  沒有歸一化的點(diǎn)云數(shù)據(jù)(帶標(biāo)簽)torch.Size([1, 7, 2048])
            points = points.transpose(2, 1)
            #print('1',target.shape) # 1 torch.Size([1, 2048])
            xyz_feature_point = points[:, :6, :]

            model = self.model

            seg_pred, _ = model(points, self.to_categorical(label, 1))
            seg_pred = seg_pred.cpu().data.numpy()

            if self.heat_map:
                out =  np.asarray(np.sum(seg_pred,axis=2))
                seg_pred = ((out - np.min(out) / (np.max(out) - np.min(out))))
            else:
                seg_pred = np.argmax(seg_pred, axis=-1)  # 獲得網(wǎng)絡(luò)的預(yù)測結(jié)果 b n c

            seg_pred = np.concatenate([np.asarray(xyz_feature_point), seg_pred[:, None, :]],
                    axis=1).transpose((0, 2, 1)).squeeze(0) 

            self.predict_pcd = seg_pred
            self.centroid = centroid
            self.m = m


    def o3d_draw_3d_img(self):

        pcd = self.predict_pcd
        pcd_vector = o3d.geometry.PointCloud()
        # 加載點(diǎn)坐標(biāo)
        pcd_vector.points = o3d.utility.Vector3dVector(self.m * pcd[:, :3] + self.centroid)
        # colors = np.random.randint(255, size=(2,3))/255
        colors = np.array([[0.8, 0.8, 0.8],[1,0,0]])
        pcd_vector.colors = o3d.utility.Vector3dVector(colors[list(map(int,pcd[:, 6])),:])

        if self.visualize:
            coord_mesh = o3d.geometry.TriangleMesh.create_coordinate_frame(size = 0.1, origin = [0,0,0])
            o3d.visualization.draw_geometries([pcd_vector,coord_mesh])
        self.predict_pcd_colored = pcd_vector

    def to_categorical(self,y, num_classes):
        """ 1-hot encodes a tensor """
        new_y = torch.eye(num_classes)[y.cpu().data.numpy(),]
        if (y.is_cuda):
            return new_y.cuda()
        return new_y

def load_models(model_dict={'PonintNet': [pointnet2(num_classes=2,normal_channel=True).eval(),r'./log/part_seg/pointnet2_part_seg_msg/checkpoints']}):
    model = list(model_dict.values())[0][0]
    checkpoints_dir = list(model_dict.values())[0][1]
    weight_dict = torch.load(os.path.join(checkpoints_dir,'best_model.pth'))
    model.load_state_dict(weight_dict['model_state_dict'])
    return model

class Open3dVisualizer():

	def __init__(self):

		self.point_cloud = o3d.geometry.PointCloud()
		self.o3d_started = False

		self.vis = o3d.visualization.VisualizerWithKeyCallback()
		self.vis.create_window()

	def __call__(self, points, colors):

		self.update(points, colors)

		return False

	def update(self, points, colors):
		coord_mesh = o3d.geometry.TriangleMesh.create_coordinate_frame(size = 0.15, origin = [0,0,0])
		self.point_cloud.points = points
		self.point_cloud.colors = colors
		# self.point_cloud.transform([[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]])
		# self.vis.clear_geometries()
		# Add geometries if it is the first time
		if not self.o3d_started:
			self.vis.add_geometry(self.point_cloud)
			self.vis.add_geometry(coord_mesh)
			self.o3d_started = True

		else:
			self.vis.update_geometry(self.point_cloud)
			self.vis.update_geometry(coord_mesh)

		self.vis.poll_events()
		self.vis.update_renderer()

if __name__ =='__main__':
    
    num_classes = 2 # 填寫數(shù)據(jù)集的類別數(shù) 如果是s3dis這里就填13   shapenet這里就填50
    
    color_image = o3d.io.read_image('image/rgb1.jpg')
    depth_image = o3d.io.read_image('image/depth1.png')
    
    point_cloud = generate_pointcloud(color_image=color_image, depth_image=depth_image)

    TEST_DATASET = PartNormalDataset(point_cloud,npoints=30000, normal_channel=True)
    testDataLoader = torch.utils.data.DataLoader(TEST_DATASET, batch_size=1, shuffle=False, num_workers=0,drop_last=True)
    predict_pcd = Generate_txt_and_3d_img(num_classes,testDataLoader,load_models(),visualize = True)

??把之前的代碼改成了針對單個點(diǎn)云預(yù)測的可視化,點(diǎn)云由GRB圖像和深度圖像生成,如果想直接輸入點(diǎn)云自己稍微改下代碼就可以了,目前僅針對shapenet數(shù)據(jù)集格式的數(shù)據(jù)。這里要注意如果訓(xùn)練的時(shí)候選擇了--normal,那么normal_channel要改成True。
??看下訓(xùn)練效果,用modelnet40里的一個chair文件進(jìn)行預(yù)測。

Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼) ? Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼) ? Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)

??可以看到這個椅子大致是分成了四塊,但是椅子靠背、腿分割地挺好的,就是扶手有一部分分割到了坐墊那里了,畢竟訓(xùn)練時(shí)間不長。modelnet40數(shù)據(jù)集只是用來分類,并沒有分割的標(biāo)注,所以這里可視化了一下shapenet里標(biāo)注好的椅子點(diǎn)云,看看椅子各個部位的分割(并非上面的椅子)。

Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼) ? Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)

??這里就比較顯而易見地看出椅子分為靠背、扶手、坐墊、腿四個部分。
??初步觀察到效果以后可以開始嘗試自己制作數(shù)據(jù)集進(jìn)行訓(xùn)練了,可以參考我寫的這篇文章:《CloudCompare制作ShapeNet格式點(diǎn)云數(shù)據(jù)集》。

場景分割

??零件分割網(wǎng)絡(luò)可以很容易地?cái)U(kuò)展到語義場景分割,點(diǎn)標(biāo)記成為語義對象類而不是目標(biāo)零件標(biāo)記。
??在 Stanford 3D語義分析數(shù)據(jù)集上進(jìn)行實(shí)驗(yàn)。該數(shù)據(jù)集包含來自Matterport掃描儀的6個區(qū)域的3D掃描,包括271個房間。掃描中的每個點(diǎn)都用13個類別(椅子、桌子、地板、墻壁等加上雜物)中的一個語義標(biāo)簽進(jìn)行注釋。
??先把文件下載過來: S3DIS ,存到文件夾data/s3dis/Stanford3dDataset_v1.2_Aligned_Version/.
??處理數(shù)據(jù),數(shù)據(jù)會存到data/stanford_indoor3d/

cd data_utils
python collect_indoor3d_data.py

??運(yùn)行:

## Check model in ./models 
## e.g., pointnet2_ssg
python train_semseg.py --model pointnet2_sem_seg --test_area 5 --log_dir pointnet2_sem_seg
python test_semseg.py --log_dir pointnet2_sem_seg --test_area 5 --visual

??上面的操作走完以后會在log/sem_seg/pointnet2_sem_seg/visual/生成預(yù)測結(jié)果的obj文件,可以用open3d進(jìn)行可視化,就是不能用o3d.io.read_triangle_mesh函數(shù)來可視化obj文件,因?yàn)檫@里生成的obj文件還帶了顏色信息用來表示語義信息,所以得讀取成列表數(shù)據(jù)然后定義成o3d.geometry.PointCloud()變量顯示,代碼如下:

import copy
import numpy as np
import open3d as o3d
import os

objFilePath = 'log/sem_seg/pointnet2_sem_seg/visual/Area_5_office_8_gt.obj'

with open(objFilePath) as file:
    points = []
    while 1:
        line = file.readline()
        if not line:
            break
        strs = line.split(" ")
        if strs[0] == "v":
            points.append(np.array(strs[1:7],dtype=float))
        if strs[0] == "vt":
            break
# points原本為列表,需要轉(zhuǎn)變?yōu)榫仃?,方便處?         
pcd = np.array(points)

pcd_vector = o3d.geometry.PointCloud()
pcd_vector.points = o3d.utility.Vector3dVector(pcd[:, :3])
pcd_vector.colors = o3d.utility.Vector3dVector(pcd[:,3:6])
o3d.visualization.draw_geometries([pcd_vector])

??康康A(chǔ)rea_5里office_8的效果:
??原圖:

Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼) ? Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼) ? Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)

??ground truth:
Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)
??predict:

Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼) ? Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)

??OK,大致算是把這個PointNet++復(fù)現(xiàn)完了,著重做了下點(diǎn)云分割,給畢設(shè)做準(zhǔn)備??偟膩碇v,訓(xùn)練和預(yù)測的過程并不難,為了康康效果,可視化的部分倒是花了挺長時(shí)間。零件分割和場景分割本質(zhì)上講其實(shí)是一回事,就是在代碼里面這兩個分割用了不同的模型來訓(xùn)練。之后打算自己制作數(shù)據(jù)集來訓(xùn)練一下,先拿零件分割的模型來做,畢竟場景分割做成S3DIS形式的數(shù)據(jù)集有點(diǎn)麻煩??傊@篇blog走肯定是能跑通PointNet++的。


??添加一個自己做的用pointnet++做的書縫識別項(xiàng)目,GitHub里面有數(shù)據(jù)集和代碼:https://github.com/struggler176393/Pointnet_book_seam。文章來源地址http://www.zghlxwxcb.cn/news/detail-413960.html

到了這里,關(guān)于Pytorch1.7復(fù)現(xiàn)PointNet++點(diǎn)云分割(含Open3D可視化)(文末有一個自己做的書縫識別項(xiàng)目代碼)的文章就介紹完了。如果您還想了解更多內(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)文章

  • open3d點(diǎn)云平移

    open3d點(diǎn)云平移

    功能簡介 open3d中點(diǎn)云的平移函數(shù)為:pcd.translate((tx, ty, tz), relative=True)。當(dāng)relative為True時(shí),(tx, ty, tz)表示點(diǎn)云平移的相對尺度,也就是平移了多少距離。當(dāng)relative為False時(shí),(tx, ty, tz)表示點(diǎn)云中心(質(zhì)心)平移到的指定位置。質(zhì)心可以坐標(biāo)可以通過pcd.get_center()得到。 代碼

    2024年01月22日
    瀏覽(42)
  • Open3d點(diǎn)云對象詳解

    Open3d點(diǎn)云對象詳解

    PointCloud 是open3d中用于點(diǎn)云處理的類,封裝了包括幾何變換、數(shù)據(jù)濾波、聚類分割等一系列實(shí)用算法。如無特別說明,本例中所有例程均基于斯坦福兔子的點(diǎn)云模型,下載地址:斯坦福標(biāo)準(zhǔn)模型 讀取和清除點(diǎn)云 一般點(diǎn)云數(shù)據(jù)的讀取方法屬于 open3d.io 的內(nèi)容,但點(diǎn)云類也提供了

    2023年04月19日
    瀏覽(52)
  • Open3D點(diǎn)云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    Open3D點(diǎn)云數(shù)據(jù)處理(一):VSCode配置python,并安裝open3d教程

    專欄地址:https://blog.csdn.net/weixin_46098577/category_11392993.html 在很久很久以前,我寫過這么一篇博客,講的是open3d點(diǎn)云處理的基本方法。?? 當(dāng)時(shí)是 PyCharm + Anaconda + python3.8 + open3d 0.13 已經(jīng)是2023年了,現(xiàn)在有了全新版本。目前python由當(dāng)年的3.8更新到了3.11版本,open3d也從0.13來到了

    2024年02月07日
    瀏覽(37)
  • Open3D常用點(diǎn)云濾波

    在點(diǎn)云處理中,過密的點(diǎn)云需要下采樣,離群點(diǎn)和噪聲點(diǎn)需要去除,通過濾波的方法,可以抽稀點(diǎn)云,把離群點(diǎn)去除,以便進(jìn)行下一步處理 open3d中,很多濾波器已經(jīng)被封裝成了對應(yīng)的方法(源碼是C++) 直通濾波過濾指定維度(x,y,z)內(nèi),指定值域外的點(diǎn) 下采樣 首先根據(jù)輸入

    2024年02月06日
    瀏覽(27)
  • open3d操作.ply文件(點(diǎn)云)

    open3d操作.ply文件(點(diǎn)云)

    讀取.ply文件

    2024年02月14日
    瀏覽(23)
  • Open3D 詳解:點(diǎn)云裁剪實(shí)戰(zhàn)

    Open3D 詳解:點(diǎn)云裁剪實(shí)戰(zhàn) 在進(jìn)行點(diǎn)云處理時(shí),經(jīng)常需要對點(diǎn)云進(jìn)行裁剪操作,以去除無用的噪點(diǎn)或僅保留感興趣區(qū)域內(nèi)的點(diǎn)云。Open3D 是一個廣泛應(yīng)用于三維數(shù)據(jù)處理的開源庫,提供了簡單易用的點(diǎn)云裁剪方法。 以下是一個基于 Open3D 的點(diǎn)云裁剪實(shí)戰(zhàn)例程。首先,我們導(dǎo)入需

    2024年02月06日
    瀏覽(29)
  • 點(diǎn)云可視化 open3D

    點(diǎn)云可視化 open3D

    禁止轉(zhuǎn)載 Python點(diǎn)云數(shù)據(jù)處理(六)Open3d補(bǔ)充:點(diǎn)云基本處理 - 知乎 https://zhuanlan.zhihu.com/p/353971365?utm_id=0 open3d繪制點(diǎn)云1–單幀點(diǎn)云 - 知乎 https://zhuanlan.zhihu.com/p/591249741 (168條消息) open3D 的使用,pcd可視化,3D bbox可視化,web_visualizer使用等。_CV礦工的博客-CSDN博客 https://blog.csdn.ne

    2024年02月09日
    瀏覽(37)
  • open3d-點(diǎn)云讀寫和顯示

    open3d-點(diǎn)云讀寫和顯示

    目錄 一,點(diǎn)云讀取 二,點(diǎn)云寫入 二,點(diǎn)云顯示 三、 open3d支持如下點(diǎn)云文件類型 ?四、代碼及結(jié)果示例 參數(shù): filename (str): 點(diǎn)云文件路徑 format (str, optional, default=\\\'auto\\\'): 輸入文件格式filehe的路徑。?如果未指定或設(shè)置為“auto”,則從文件擴(kuò)展名推斷格式? remove_nan_points (bool,

    2024年02月04日
    瀏覽(25)
  • Open3D 點(diǎn)云裁剪(Python版本)

    基于用戶給定的多邊形區(qū)域,來提取區(qū)域內(nèi)所有的點(diǎn)云數(shù)據(jù),這個多邊形Open3D會通過一個json文件來進(jìn)行指定。 CropPointCloud.py

    2024年02月13日
    瀏覽(45)
  • PyQt open3d 加載 顯示點(diǎn)云

    PyQt open3d 加載 顯示點(diǎn)云

    PyQt加載 顯示點(diǎn)云,已經(jīng)有三種方式,使用 open3d; 使用 vtk; 使用 pcl; 下面是使用 open3d: ?

    2024年02月11日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包