当前位置:网站首页>点云数据集常用处理
点云数据集常用处理
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
边栏推荐
- An 8266 crash
- 腾讯云GPU最佳实践-使用jupyter pycharm远程开发训练
- [report] Microsoft: application of deep learning methods in speech enhancement
- ArcGIS JS API dojoconfig configuration
- Client interns of a large factory share their experience face to face
- Circuit on-line simulation
- Codeforces Round #783 (Div. 2) D题解
- The difference between ordinary inner class and static inner class
- Modify the font size of hint in editext
- Using bafayun to control the computer
猜你喜欢

Audio signal processing and coding - 2.5.3 the discrete cosine transform

Raspberry pie 18b20 temperature

Class loading process of JVM

ArcMap连接 arcgis server

Wechat applet part of the mobile phone Preview PDF did not respond

SQL常用的命令

Download xshell 6 and xftp6 official websites

微搭低代码零基础入门课(第三课)

MySQL restores or rolls back data through binlog

ArcMap publishing slicing service
随机推荐
One of the reasons why the WebView web page cannot be opened (and some WebView problem records encountered by myself)
After opening the original normal project, the dependency package displays red and does not exist.
Redis optimization series (III) solve common problems after master-slave configuration
Oracle configuration st_ geometry
Some records used by VS2010
Installation, use and problem summary of binlog2sql tool
FTP, SSH Remote Access and control
高层次人才一站式服务平台开发 人才综合服务平台系统
开关电源设计分享及电源设计技巧图解
Parsing headless jsonarray arrays
Coolweather is revised and connected to the wind weather interface to realize the broken line diagram of temperature
mysql通过binlog恢复或回滚数据
mysql_linux版本的下载及安装详解
SSDB基础
FTP、ssh远程访问及控制
12个例子夯实promise基础
Redis common interview questions
Introduction to micro build low code zero Foundation (lesson 3)
redis优化系列(三)解决主从配置后的常见问题
JS controls the file type and size when uploading files