




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第Python如何用NumPy讀取和保存點云數(shù)據(jù)目錄前言loadtxt函數(shù)的用法基本用法指定每一列的數(shù)據(jù)類型結(jié)合生成器使用tofile和fromfile函數(shù)
前言
最近在學(xué)習(xí)點云處理的時候用到了Modelnet40數(shù)據(jù)集,該數(shù)據(jù)集總共有40個類別,每個樣本的點云數(shù)據(jù)存放在一個TXT文件中,每行的前3個數(shù)據(jù)代表一個點的xyz坐標。我需要把TXT文件中的每個點讀取出來,然后用Open3D進行顯示。怎么把數(shù)據(jù)從TXT文件中讀取出來呢?NumPy提供了一個功能非常強大的函數(shù)loadtxt可以非常簡單地實現(xiàn)這個功能。來看一下代碼:
import
open3d
as
o3d
import
numpy
as
np
def
main():
points_data
=
np.loadtxt("airplane_0001.txt",
delimiter=",",
dtype=np.float32)
pcd
=
o3d.geometry.PointCloud()
pcd.points
=
o3d.utility.Vector3dVector(points_data[:,
:3])
o3d.visualization.draw_geometries([pcd])
if
__name__
==
'__main__':
main()
從上面的代碼可以看到,只需要一行代碼就可以把TXT文件中的點云數(shù)據(jù)讀取進來了,接下來就可以調(diào)用Open3D的接口進行顯示了。在介紹loadtxt函數(shù)的用法之前,
順便看一下Open3D的顯示效果:
loadtxt函數(shù)的用法
基本用法
在上面的例子中,由于TXT里面每一行的數(shù)據(jù)是用逗號分割的,所以在調(diào)用loadtxt函數(shù)的時候除了設(shè)置文件路徑外,還需要設(shè)置參數(shù)delimiter=,。另外,該函數(shù)默認的數(shù)據(jù)類型為float64,如果是其他數(shù)據(jù)類型的話還需要設(shè)置dtype為對應(yīng)類型。
points_data
=
np.loadtxt("airplane_0001.txt",
delimiter=",")
#沒有指定數(shù)據(jù)類型
print('shape:
',
points_data.shape)
print('data
type:
',
points_data.dtype)
結(jié)果:
shape:(10000,6)
datatype:float64
指定每一列的數(shù)據(jù)類型
假如我們有一個CSV文件:
x,y,z,label,id
-0.098790,-0.182300,0.163800,1,1
0.994600,0.074420,0.010250,0.2,2
0.189900,-0.292200,-0.926300,3,3
-0.989200,0.074610,-0.012350,4,4
該文件前面3列的數(shù)據(jù)類型是浮點型,后面2列的數(shù)據(jù)類型為整型,那么按照前面的方式設(shè)置dtype來讀取就不合適了。不過沒關(guān)系,loadtxt函數(shù)可以設(shè)置每一列數(shù)據(jù)的數(shù)據(jù)類型,只不過稍微復(fù)雜一點,來看一下代碼:
data
=
np.loadtxt("test.txt",
delimiter=",",
dtype={'names':
('x',
'y',
'z',
'label',
'id'),
'formats':
('f4',
'f4',
'f4',
'i4',
'i4')},
skiprows=1)
print('data:
',
data)
print('data
type:
',
data.dtype)
這段代碼的重點是dtype={}里面的內(nèi)容,names用來設(shè)置每一列數(shù)據(jù)的名稱,formats則用來設(shè)置每一列數(shù)據(jù)的數(shù)據(jù)類型,其中f4表示float32,i4表示int32。另外,CSV文件中的第一行不是數(shù)據(jù)內(nèi)容,可以設(shè)置參數(shù)skiprows=1跳過第一行的內(nèi)容。
輸出結(jié)果:
data:[(-0.09879,-0.1823,0.1638,1,1)(0.9946,0.07442,0.01025,0,2)
(0.1899,-0.2922,-0.9263,3,3)(-0.9892,0.07461,-0.01235,4,4)]
datatype:[(x,f4),(y,f4),(z,f4),(label,i4),(id,i4)]
可以看到,通過這樣的方式設(shè)置dtype,讀取的每一行數(shù)據(jù)變成了一個tuple類型。
結(jié)合生成器使用
從NumPy的文檔中可以知道,loadtxt函數(shù)的第一個參數(shù)可以是文件對象、文件名或者生成器。傳入生成器有什么用呢?我們來看幾個例子。
處理多個分隔符
假如我們的文件內(nèi)容是這樣的,每一行數(shù)據(jù)有3個分隔符,,/和-:
9.87,1.82,1.63,1/11-1
9.94,7.44,1.02,1/11-2
1.89,2.92,9.26,1/11-3
0.98,7.46,1.23,1/11-4
這種情況下不能通過delimiter參數(shù)設(shè)置多個分隔符,這時候就可以通過生成器來進行處理:
def
generate_lines(file_path,
delimiters=[]):
with
open("test.txt")
as
f:
for
line
in
f:
line
=
line.strip()
for
d
in
delimiters:
line
=
line.replace(d,
"
")
yield
line
delimiters
=
[",",
"/",
"-"]
generator
=
generate_lines("test.txt",
delimiters)
data
=
np.loadtxt(generator)
print(data)
這段代碼構(gòu)建了一個生成器將文件中每一行的分隔符全部替換成loadtxt函數(shù)默認的空格分隔符,然后把生成器傳入loadtxt函數(shù),這樣loadtxt函數(shù)就能成功解析文件中的數(shù)據(jù)了。
輸出結(jié)果:
[[9.871.821.631.11.1.]
[9.947.441.021.11.2.]
[1.892.929.261.11.3.]
[0.987.461.231.11.4.]]
讀取指定的行
在某些情況下,我們需要讀取指定幾行的數(shù)據(jù),那么也可以通過生成器來實現(xiàn)。還是上面的文件內(nèi)容,我們通過生成器來讀取第2行和第3行:
def
generate_lines(file_path,
delimiters=[],
rows=[]):
with
open("test.txt")
as
f:
for
i,
line
in
enumerate(f):
line
=
line.strip()
for
d
in
delimiters:
line
=
line.replace(d,
"
")
if
i
in
rows:
yield
line
delimiters
=
[",",
"/",
"-"]
rows
=
[1,
2]
generator
=
generate_lines("test.txt",
delimiters,
rows)
data
=
np.loadtxt(generator)
print(data)
輸出結(jié)果:
[[9.947.441.021.11.2.]
[1.892.929.261.11.3.]]
通過上面的例子可以知道,loadtxt函數(shù)結(jié)合生成器使用可以實現(xiàn)很多的功能。
tofile和fromfile函數(shù)
從TXT文件中讀取到點云數(shù)據(jù)后,我想把數(shù)據(jù)保存到二進制文件中,需要怎么操作呢?NumPy的ndarray類提供了tofile函數(shù)可以非常方便地將數(shù)據(jù)保存到二進制文件中。把數(shù)據(jù)以二進制文件保存后又怎么讀進來呢?NumPy還提供了一個fromfile函數(shù)用于從文本文件和二進制文件中讀取數(shù)據(jù)。
import
open3d
as
o3d
import
numpy
as
np
def
main():
points_data
=
np.loadtxt(
"airplane_0001.txt",
delimiter=",",
dtype=np.float32)
bin_file
=
'airplane_0001.bin'
points_data
=
points_data[:,
:3]
points_data.tofile(bin_file)
pc
=
np.fromfile(bin_file,
dtype=np.float32)
pc
=
pc.reshape(-1,
3)
pcd
=
o3d.geometry.PointCloud()
pcd.points
=
o3d.utility.Vector3dVector(pc)
o3d.visualiza
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一級市政試題及答案
- 戶外拓展服務(wù)合同協(xié)議書
- 2025年醫(yī)用電子直線加速器合作協(xié)議書
- 2025年智能卡制作發(fā)行機項目合作計劃書
- 網(wǎng)紅餐飲品牌連鎖加盟授權(quán)與特色原料供應(yīng)協(xié)議
- 域名注冊與轉(zhuǎn)讓爭議解決協(xié)議
- 網(wǎng)絡(luò)安全前沿介紹
- 藥品進口清關(guān)與市場準入代理服務(wù)協(xié)議
- 農(nóng)業(yè)設(shè)施大棚租賃與農(nóng)業(yè)觀光服務(wù)合同
- 貨物運輸途中自然災(zāi)害賠償合同
- 隧道工程隧道洞口臨建施工方案
- 心理咨詢的面談技術(shù)
- DBJ∕T13-374-2021 福建省鋼筋桁架疊合樓板技術(shù)標準
- 事故池管理的有關(guān)規(guī)定
- (word完整版)污水處理廠安全評價報告
- DB50∕T 867.6-2019 安全生產(chǎn)技術(shù)規(guī)范 第6部分:黑色金屬冶煉企業(yè)
- 新產(chǎn)品開發(fā)流程課件
- 高中語文部編版選擇性必修下冊第四單元 單元學(xué)習(xí)導(dǎo)航 課件 (8張PPT)
- 化妝品原料-PPT課件
- 重慶市參加企業(yè)職工基本養(yǎng)老保險人員退休審批表
- 混凝土結(jié)構(gòu)課程設(shè)計244
評論
0/150
提交評論