当前位置:网站首页>点云数据集常用处理
点云数据集常用处理
2022-04-23 19:13:00 【给算法爸爸上香】
数据集增强
仿射变换
平移变换
import numpy as np
import random
#文件名
old_file=r"rabbit.txt"
new_file=r"rabbit_change.txt"
#平移参数
x_offset=random.uniform(-10, 10)
y_offset=random.uniform(-10, 10)
z_offset=random.uniform(-10, 10)
#变换矩阵
transformation_matrix=np.array([
[1,0,0,x_offset],
[0,1,0,y_offset],
[0,0,1,z_offset],
[0,0,0,1]
])
#加载文件
old_array=np.loadtxt(old_file)
old_xyz=old_array[:,:3]
#补充数据为齐次项
ones_data=np.ones(old_xyz.shape[0])
old_xyz=np.insert(old_xyz,3,values=ones_data,axis=1)
#变换数据
new_xyz = np.dot(transformation_matrix,old_xyz.T)
new_array=np.concatenate((new_xyz.T[:,:3],old_array[:,3:]),axis=1)
np.savetxt(new_file,new_array,fmt='%.06f')
旋转变换
import numpy as np
import random
#文件名
old_file=r"rabbit.txt"
new_file=r"rabbit_change.txt"
#旋转角度
roate_x=random.uniform(-np.pi/10, np.pi/10)
roate_y=random.uniform(-np.pi/10, np.pi/10)
roate_z=random.uniform(-np.pi/10, np.pi/10)
roate_x_matrix=np.array([
[1,0,0,0],
[0,np.cos(roate_x),-np.sin(roate_x),0],
[0,np.sin(roate_x),np.cos(roate_x),0],
[0,0,0,1]
])
roate_y_matrix=np.array([
[np.cos(roate_y),0,np.sin(roate_y),0],
[0,1,0,0],
[-np.sin(roate_y),0,np.cos(roate_y),0],
[0,0,0,1]
])
roate_z_matrix=np.array([
[np.cos(roate_z),-np.sin(roate_z),0,0],
[np.sin(roate_z),np.cos(roate_z),0,0],
[0,0,1,0],
[0,0,0,1]
])
#变换矩阵
transformation_matrix=dot(roate_z_matrix).dot(roate_y_matrix).dot(roate_x_matrix)
#加载文件
old_array=np.loadtxt(old_file)
old_xyz=old_array[:,:3]
#补充数据为齐次项
ones_data=np.ones(old_xyz.shape[0])
old_xyz=np.insert(old_xyz,3,values=ones_data,axis=1)
#变换数据
new_xyz = np.dot(transformation_matrix,old_xyz.T)
new_array=np.concatenate((new_xyz.T[:,:3],old_array[:,3:]),axis=1)
np.savetxt(new_file,new_array,fmt='%.06f')
尺度变换
import numpy as np
import random
#文件名
old_file=r"rabbit.txt"
new_file=r"rabbit_change.txt"
#缩放参数
scale=0.1
#变换矩阵
transformation_matrix=np.array([
[scale,0,0,0],
[0,scale,0,0],
[0,0,scale,0],
[0,0,0,1]
])
#加载文件
old_array=np.loadtxt(old_file)
old_xyz=old_array[:,:3]
#补充数据为齐次项
ones_data=np.ones(old_xyz.shape[0])
old_xyz=np.insert(old_xyz,3,values=ones_data,axis=1)
#变换数据
new_xyz = np.dot(transformation_matrix,old_xyz.T)
new_array=np.concatenate((new_xyz.T[:,:3],old_array[:,3:]),axis=1)
np.savetxt(new_file,new_array,fmt='%.06f')
仿射变换
上面三种变换综合可以写成:
import numpy as np
import random
#文件名
old_file=r"rabbit.txt"
new_file=r"rabbit_change.txt"
#平移参数
x_offset=random.uniform(-10, 10)
y_offset=random.uniform(-10, 10)
z_offset=random.uniform(-10, 10)
#缩放参数
scale=0.1
#旋转角度
roate_x=random.uniform(-np.pi/10, np.pi/10)
roate_y=random.uniform(-np.pi/10, np.pi/10)
roate_z=random.uniform(-np.pi/10, np.pi/10)
roate_x_matrix=np.array([
[1,0,0,0],
[0,np.cos(roate_x),-np.sin(roate_x),0],
[0,np.sin(roate_x),np.cos(roate_x),0],
[0,0,0,1]
])
roate_y_matrix=np.array([
[np.cos(roate_y),0,np.sin(roate_y),0],
[0,1,0,0],
[-np.sin(roate_y),0,np.cos(roate_y),0],
[0,0,0,1]
])
roate_z_matrix=np.array([
[np.cos(roate_z),-np.sin(roate_z),0,0],
[np.sin(roate_z),np.cos(roate_z),0,0],
[0,0,1,0],
[0,0,0,1]
])
#变换矩阵
transformation_matrix=np.array([
[scale,0,0,x_offset],
[0,scale,0,y_offset],
[0,0,scale,z_offset],
[0,0,0,1]
]).dot(roate_z_matrix).dot(roate_y_matrix).dot(roate_x_matrix)
#加载文件
old_array=np.loadtxt(old_file)
old_xyz=old_array[:,:3]
#补充数据为齐次项
ones_data=np.ones(old_xyz.shape[0])
old_xyz=np.insert(old_xyz,3,values=ones_data,axis=1)
#变换数据
new_xyz = np.dot(transformation_matrix,old_xyz.T)
new_array=np.concatenate((new_xyz.T[:,:3],old_array[:,3:]),axis=1)
np.savetxt(new_file,new_array,fmt='%.06f')
仿射变换:
PCL 仿射变换,实现点云平移旋转
添加噪声
import numpy as np
#文件名
old_file=r"rabbit.txt"
new_file=r"rabbit_change.txt"
def add_noise(point, sigma=0.1, clip=0.1):
point = point.reshape(-1,3)
Row, Col = point.shape
noisy_point = np.clip(sigma * np.random.randn(Row, Col), -1*clip, clip)
noisy_point += point
return noisy_point
#加载文件
old_array=np.loadtxt(old_file)
old_xyz=old_array[:,:3]
new_xyz=add_noise(old_xyz)
new_array=np.concatenate((new_xyz,old_array[:,3:]),axis=1)
np.savetxt(new_file,new_array,fmt='%.06f')
下采样
import numpy as np
#文件名
old_file=r"rabbit.txt"
new_file=r"rabbit_change.txt"
#体素滤波
def voxel_filter(point_cloud, leaf_size):
filtered_points = []
# 计算边界点
x_min, y_min, z_min = np.amin(point_cloud, axis=0) #计算x y z 三个维度的最值
x_max, y_max, z_max = np.amax(point_cloud, axis=0)
# 计算 voxel grid维度
Dx = (x_max - x_min) // leaf_size + 1
Dy = (y_max - y_min) // leaf_size + 1
Dz = (z_max - z_min) // leaf_size + 1
# 计算每个点的voxel索引
h = list() # h为保存索引的列表
for i in range(len(point_cloud)):
hx = (point_cloud[i][0] - x_min) // leaf_size
hy = (point_cloud[i][1] - y_min) // leaf_size
hz = (point_cloud[i][2] - z_min) // leaf_size
h.append(hx + hy * Dx + hz * Dx * Dy)
h = np.array(h)
#筛选点
h_indice = np.argsort(h) #返回h里面的元素按从小到大排序的索引
h_sorted = h[h_indice]
begin = 0
for i in range(len(h_sorted) - 1): # 0~9999
if h_sorted[i] != h_sorted[i + 1]:
point_idx = h_indice[begin: i + 1]
filtered_points.append(np.mean(point_cloud[point_idx], axis=0))
begin = i+1
#把点云格式改成array,并对外返回
filtered_points = np.array(filtered_points, dtype=np.float64)
return filtered_points
#加载文件
old_array=np.loadtxt(old_file)
old_xyz=old_array[:,:3]
#保存文件
new_xyz=voxel_filter(old_xyz, 1)
np.savetxt(new_file,new_xyz,fmt='%.06f')
数据归一化
去中心化
centroid = np.mean(pc, axis=0)
pc = pc - centroid
尺度归一化
m = np.max(np.sqrt(np.sum(pc**2, axis=1)))
pc = pc / m
版权声明
本文为[给算法爸爸上香]所创,转载请带上原文链接,感谢
https://blog.csdn.net/taifyang/article/details/124365265
边栏推荐
- SQL server requires to query the information of all employees with surname 'Wang'
- [report] Microsoft: application of deep learning methods in speech enhancement
- @Analysis of conditional on Web Application
- Parsing headless jsonarray arrays
- 深度学习环境搭建步骤—gpu
- Openlayers 5.0 discrete aggregation points
- : app: transformclasseswithrobustfordevrease meituan hot repair compilation error record
- [报告] Microsoft :Application of deep learning methods in speech enhancement
- Some records used by VS2010
- js上传文件时控制文件类型和大小
猜你喜欢

mysql_linux版本的下载及安装详解

JVM的类加载过程

I just want to leave a note for myself

One of the reasons why the WebView web page cannot be opened (and some WebView problem records encountered by myself)

Download xshell 6 and xftp6 official websites

Oracle configuration st_ geometry

On the forced conversion of C language pointer

開關電源設計分享及電源設計技巧圖解

Android Development: the client obtains the latest value in the database in real time and displays it on the interface

2022.04.23 (the best time for lc_714_to buy and sell stocks, including handling charges)
随机推荐
MySQL statement
浅谈c语言指针的强制转换
[advanced level 11 of C language -- character and string functions and their simulation implementation (2)]
Network protocol: SCTP flow control transmission protocol
From technical system to business insight, the closing chapter of the practice of small and medium-sized R & D team structure
Customize the non slidable viewpage and how to use it
Transaction processing of SQL Server database
开关电源设计分享及电源设计技巧图解
在渤海期货办理开户安全吗。
mysql_ Download and installation of Linux version
Click the input box to pop up the keyboard layout and move up
腾讯云GPU最佳实践-使用jupyter pycharm远程开发训练
c1000k TCP 连接上限测试1
[play with lighthouse] Tencent cloud lightweight server builds a full platform video analysis video download website
White screen processing method of fulter startup page
SQL server requires to query the information of all employees with surname 'Wang'
Wechat applet part of the mobile phone Preview PDF did not respond
UML类图几种关系的总结
Sword finger offer II 116 Number of provinces - spatial complexity O (n), time complexity O (n)
Openlayers 5.0 thermal diagram