Open 3D 사용 방법: FPFH 피쳐로 등록
12996 단어 FPFHPointCloudPythonOpen3D
점 그룹 피쳐 FPFH 정렬, ICP 미세조정.
더 보기 쉽게 - 공식 강좌해 보세요.
- 수치가 하드 코드이기 때문에 점 그룹의 1/10 크기를 기반으로 다른 여러 매개변수를 결정합니다.
- 방법명 길이
import as
짧음Tips:
- 샘플링 크기를 1/10 정도로 줄이지 않으면 RANSAC이 제대로 작동하지 않음
- FPFH의 크기는 1/10*50입니다. 큰 것이 좋습니다. (너무 작으면 피쳐 계산에 사용되는 포인트가 줄어들기 때문입니다.)
- 법선 계산은 1/10이지만 영향을 주지 않습니다.
코드
open3dimport sys
sys.path.append("../..") # Open3D/build/lib/ へのパス
import copy
import numpy as np
import py3d
from py3d import registration_ransac_based_on_feature_matching as RANSAC
from py3d import registration_icp as ICP
from py3d import compute_fpfh_feature as FPFH
def show(model, scene, model_to_scene_trans=np.identity(4)):
model_t = copy.deepcopy(model)
scene_t = copy.deepcopy(scene)
model_t.paint_uniform_color([1, 0, 0])
scene_t.paint_uniform_color([0, 0, 1])
model_t.transform(model_to_scene_trans)
py3d.draw_geometries([model_t, scene_t])
model = py3d.read_point_cloud("bun000.ply")
scene = py3d.read_point_cloud("bun045.ply")
## PCLモデルを使うならこちら
#model = py3d.read_point_cloud("milk.pcd")
#scene = py3d.read_point_cloud("milk_cartoon_all_small_clorox.pcd")
# いろいろなサイズの元: model点群の1/10を基本サイズsizeにする
size = np.abs((model.get_max_bound() - model.get_min_bound())).max() / 10
kdt_n = py3d.KDTreeSearchParamHybrid(radius=size, max_nn=50)
kdt_f = py3d.KDTreeSearchParamHybrid(radius=size * 50, max_nn=50)
py3d.estimate_normals(model, kdt_n)
py3d.estimate_normals(scene, kdt_n)
show(model, scene)
# ダウンサンプリング
model_d = py3d.voxel_down_sample(model, size)
scene_d = py3d.voxel_down_sample(scene, size)
py3d.estimate_normals(model_d, kdt_n)
py3d.estimate_normals(scene_d, kdt_n)
show(model_d, scene_d)
# 特徴量計算
model_f = FPFH(model_d, kdt_f)
scene_f = FPFH(scene_d, kdt_f)
# 準備
checker = [py3d.CorrespondenceCheckerBasedOnEdgeLength(0.9),
py3d.CorrespondenceCheckerBasedOnDistance(size * 2)]
est_ptp = py3d.TransformationEstimationPointToPoint()
est_ptpln = py3d.TransformationEstimationPointToPlane()
criteria = py3d.RANSACConvergenceCriteria(max_iteration=40000,
max_validation=500)
# RANSACマッチング
result1 = RANSAC(model_d, scene_d,
model_f, scene_f,
max_correspondence_distance=size * 2,
estimation_method=est_ptp,
ransac_n=4,
checkers=checker,
criteria=criteria)
show(model_d, scene_d, result1.transformation)
# ICPで微修正
result2 = ICP(model, scene, size, result1.transformation, est_ptpln)
show(model, scene, result2.transformation)
결실
다음 결과는 사이즈가 1/30일 때의 결과입니다.
bunny
원시 점군
샘플링 후
RANSAC 일치 후
ICP 이후
PCL의 저항 연마 데이터
원시 점군
샘플링 후
RANSAC 일치 후
ICP 이후
Reference
이 문제에 관하여(Open 3D 사용 방법: FPFH 피쳐로 등록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tttamaki/items/14ac652f4030751ad2f1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import sys
sys.path.append("../..") # Open3D/build/lib/ へのパス
import copy
import numpy as np
import py3d
from py3d import registration_ransac_based_on_feature_matching as RANSAC
from py3d import registration_icp as ICP
from py3d import compute_fpfh_feature as FPFH
def show(model, scene, model_to_scene_trans=np.identity(4)):
model_t = copy.deepcopy(model)
scene_t = copy.deepcopy(scene)
model_t.paint_uniform_color([1, 0, 0])
scene_t.paint_uniform_color([0, 0, 1])
model_t.transform(model_to_scene_trans)
py3d.draw_geometries([model_t, scene_t])
model = py3d.read_point_cloud("bun000.ply")
scene = py3d.read_point_cloud("bun045.ply")
## PCLモデルを使うならこちら
#model = py3d.read_point_cloud("milk.pcd")
#scene = py3d.read_point_cloud("milk_cartoon_all_small_clorox.pcd")
# いろいろなサイズの元: model点群の1/10を基本サイズsizeにする
size = np.abs((model.get_max_bound() - model.get_min_bound())).max() / 10
kdt_n = py3d.KDTreeSearchParamHybrid(radius=size, max_nn=50)
kdt_f = py3d.KDTreeSearchParamHybrid(radius=size * 50, max_nn=50)
py3d.estimate_normals(model, kdt_n)
py3d.estimate_normals(scene, kdt_n)
show(model, scene)
# ダウンサンプリング
model_d = py3d.voxel_down_sample(model, size)
scene_d = py3d.voxel_down_sample(scene, size)
py3d.estimate_normals(model_d, kdt_n)
py3d.estimate_normals(scene_d, kdt_n)
show(model_d, scene_d)
# 特徴量計算
model_f = FPFH(model_d, kdt_f)
scene_f = FPFH(scene_d, kdt_f)
# 準備
checker = [py3d.CorrespondenceCheckerBasedOnEdgeLength(0.9),
py3d.CorrespondenceCheckerBasedOnDistance(size * 2)]
est_ptp = py3d.TransformationEstimationPointToPoint()
est_ptpln = py3d.TransformationEstimationPointToPlane()
criteria = py3d.RANSACConvergenceCriteria(max_iteration=40000,
max_validation=500)
# RANSACマッチング
result1 = RANSAC(model_d, scene_d,
model_f, scene_f,
max_correspondence_distance=size * 2,
estimation_method=est_ptp,
ransac_n=4,
checkers=checker,
criteria=criteria)
show(model_d, scene_d, result1.transformation)
# ICPで微修正
result2 = ICP(model, scene, size, result1.transformation, est_ptpln)
show(model, scene, result2.transformation)
다음 결과는 사이즈가 1/30일 때의 결과입니다.
bunny
원시 점군
샘플링 후
RANSAC 일치 후
ICP 이후
PCL의 저항 연마 데이터
원시 점군
샘플링 후
RANSAC 일치 후
ICP 이후
Reference
이 문제에 관하여(Open 3D 사용 방법: FPFH 피쳐로 등록), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tttamaki/items/14ac652f4030751ad2f1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)