【open3d】点云旋转

索引

一、原理
二、源码
三、结果


一、原理

这里是引用

1. xxx


二、源码


"""
    根据旋转轴两个端点、旋转角度,得到旋转矩阵
    v1   旋转轴端点1 (-130.009995,-158.779999,31.349001)
    v2   旋转轴端点2 (-129.216995,-157.925003,31.320999)
    theta 旋转弧度 60度
"""
def rotateMatrix(v1, v2, theta):
    # 向量相减
    p = np.asarray(v2) - np.asarray(v1)
    # 求单位向量
    rand_axis = p / np.linalg.norm(p)
    # 旋转角度
    r = math.radians(theta)
    # 返回旋转矩阵
    rot_matrix = linalg.expm(np.cross(np.eye(3), rand_axis * r))

    return rot_matrix


"""
    点云旋转
    file_path  pcd 格式点云文件
    point1   旋转轴端点1 (-130.009995,-158.779999,31.349001)
    point2   旋转轴端点2 (-129.216995,-157.925003,31.320999)
    rotate_angle 旋转弧度 60度
    save_path   旋转后pcd 格式保存的点云地址
"""
def pointCloud_rotate(file_path, point1, point2, rotate_angle, save_path):
    pcd = o3d.io.read_point_cloud(file_path)
    points=np.asarray(pcd.points)
    np_max = np.where(points[:, 2] >= points[:, 2].max())[0]
    index=pcd.select_by_index(np_max)
    rotate_center=tuple((index.points)[0])
    print("rotate_center",rotate_center)
    ro_pcd = deepcopy(pcd)
    # R = pcd.get_rotation_matrix_from_xyz(rotate_angle)
    R = rotateMatrix(point1,point2,rotate_angle)
    print(R)
    ro_pcd.rotate(R, center=rotate_center)

    crop__rotation_pcd_address=save_path+now+"crop_ro_.pcd"
    o3d.io.write_point_cloud(crop__rotation_pcd_address, ro_pcd)

    return crop__rotation_pcd_address
    


三、结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT从业者的职业生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值