f.write - 更改输入数据后出现不支持的格式字符错误
f.write - unsupported format character error after changing input data
当我想将我的点云数据保存为 .ply 文件时出现值错误。这是可以在此处找到的示例的稍微修改的代码:https://github.com/opencv/opencv/blob/master/samples/python/stereo_match.py
我使用不同的数据输入,但我以与示例中相同的文件格式为 x y z -data 和 r g b -data 创建了必要的数组。 x y z 保存为 float32-(n,3) 数组,r g b 保存为 uint8-(n,3) 数组。错误消息是关于不支持的格式字符,但我无法弄清楚为什么仅更改输入数据后会出现此错误?
(使用原始图像写入 .ply 文件没有问题)
这是错误信息:
f.write((plyHeader %
dict(vert_num=len(verts))).encode('utf-8'))
ValueError: unsupported format character '
' (0xa) at index 47
创建 .ply 文件的代码:
#create standard ply header
plyHeader = '''ply
format ascii 1.0
element vertex %(vert_num)
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
'''
#function that writes the .ply file
def writePly(fn, verts, colors):
#reshaping (if not already in (nx3))
verts = verts.reshape(-1, 3)
colors = colors.reshape(-1, 3)
#horizontal stacking so I have an (nx6) array
verts = np.hstack([verts, colors]) (nx6)
with open(fn, 'wb') as f:
#write the file, this is the part where the error occurs
f.write((plyHeader % dict(vert_num=len(verts))).encode('utf-8'))
np.savetxt(f, verts, fmt='%f %f %f %d %d %d ')
#create the used data using a mask that masks out bad pixels
colors = imgL[mask]
#point cloud data
out_points = np.float32(
np.squeeze(np.dstack((xWorld,yWorld,zWorld))))
#colors, my image is grayscales so I use the same values for rgb
out_colors = np.squeeze(np.dstack((colors,colors,colors)))
out_fn = 'out.ply'
writePly('out.ply', out_points, out_colors)
print('%s saved' % 'out.ply')
所以我的问题是,什么格式字符导致了这个错误,我该如何解决这个问题?
最后我想要一个包含我的数据的文件:
ply
format ascii 1.0
element vertex 231229
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
-9.215469 12.265193 -22.665194 228 199 141
-9.171270 12.265193 -22.665194 211 183 128
-9.127071 12.265193 -22.665194 197 183 138
-9.082873 12.265193 -22.665194 180 181 145
-9.038674 12.265193 -22.665194 148 162 132
-9.019390 12.299169 -22.727978 143 165 134
-9.000000 12.333333 -22.791111 156 182 147
-8.980501 12.367688 -22.854595 164 190 151
-8.935933 12.367688 -22.854595 169 194 153
-8.891365 12.367688 -22.854595 175 196 156
-8.797784 12.299169 -22.727978 180 196 159
-8.729281 12.265193 -22.665194 182 195 160
-8.685082 12.265193 -22.665194 183 196 161
-8.640884 12.265193 -22.665194 182 199 162
-8.596685 12.265193 -22.665194 177 201 162
-8.552486 12.265193 -22.665194 174 202 161
好吧,我想到了某种 "workaround"。
我无法弄清楚由以某种方式填写 header 引起的错误。所以我只写了一个包含 6 列的 txt-file,然后我将数据导入 CloudCompare 一个可视化点云的工具。工作没有问题。
def writeFile(fn, verts, colors):
verts = np.array(verts.reshape(-1, 3))
colors = np.array(colors.reshape(-1, 3))
vertsStack = np.squeeze([np.hstack([verts, colors])])
with open(fn, 'wb') as f:
np.savetxt(f, vertsStack, fmt='%f %f %f %d %d %d ')
有关 CloudCompare 和链接的更多信息,请查看此问题:
Point cloud XYZ format specification
当我想将我的点云数据保存为 .ply 文件时出现值错误。这是可以在此处找到的示例的稍微修改的代码:https://github.com/opencv/opencv/blob/master/samples/python/stereo_match.py
我使用不同的数据输入,但我以与示例中相同的文件格式为 x y z -data 和 r g b -data 创建了必要的数组。 x y z 保存为 float32-(n,3) 数组,r g b 保存为 uint8-(n,3) 数组。错误消息是关于不支持的格式字符,但我无法弄清楚为什么仅更改输入数据后会出现此错误?
(使用原始图像写入 .ply 文件没有问题)
这是错误信息:
f.write((plyHeader %
dict(vert_num=len(verts))).encode('utf-8'))
ValueError: unsupported format character '
' (0xa) at index 47
创建 .ply 文件的代码:
#create standard ply header
plyHeader = '''ply
format ascii 1.0
element vertex %(vert_num)
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
'''
#function that writes the .ply file
def writePly(fn, verts, colors):
#reshaping (if not already in (nx3))
verts = verts.reshape(-1, 3)
colors = colors.reshape(-1, 3)
#horizontal stacking so I have an (nx6) array
verts = np.hstack([verts, colors]) (nx6)
with open(fn, 'wb') as f:
#write the file, this is the part where the error occurs
f.write((plyHeader % dict(vert_num=len(verts))).encode('utf-8'))
np.savetxt(f, verts, fmt='%f %f %f %d %d %d ')
#create the used data using a mask that masks out bad pixels
colors = imgL[mask]
#point cloud data
out_points = np.float32(
np.squeeze(np.dstack((xWorld,yWorld,zWorld))))
#colors, my image is grayscales so I use the same values for rgb
out_colors = np.squeeze(np.dstack((colors,colors,colors)))
out_fn = 'out.ply'
writePly('out.ply', out_points, out_colors)
print('%s saved' % 'out.ply')
所以我的问题是,什么格式字符导致了这个错误,我该如何解决这个问题? 最后我想要一个包含我的数据的文件:
ply
format ascii 1.0
element vertex 231229
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
-9.215469 12.265193 -22.665194 228 199 141
-9.171270 12.265193 -22.665194 211 183 128
-9.127071 12.265193 -22.665194 197 183 138
-9.082873 12.265193 -22.665194 180 181 145
-9.038674 12.265193 -22.665194 148 162 132
-9.019390 12.299169 -22.727978 143 165 134
-9.000000 12.333333 -22.791111 156 182 147
-8.980501 12.367688 -22.854595 164 190 151
-8.935933 12.367688 -22.854595 169 194 153
-8.891365 12.367688 -22.854595 175 196 156
-8.797784 12.299169 -22.727978 180 196 159
-8.729281 12.265193 -22.665194 182 195 160
-8.685082 12.265193 -22.665194 183 196 161
-8.640884 12.265193 -22.665194 182 199 162
-8.596685 12.265193 -22.665194 177 201 162
-8.552486 12.265193 -22.665194 174 202 161
好吧,我想到了某种 "workaround"。 我无法弄清楚由以某种方式填写 header 引起的错误。所以我只写了一个包含 6 列的 txt-file,然后我将数据导入 CloudCompare 一个可视化点云的工具。工作没有问题。
def writeFile(fn, verts, colors):
verts = np.array(verts.reshape(-1, 3))
colors = np.array(colors.reshape(-1, 3))
vertsStack = np.squeeze([np.hstack([verts, colors])])
with open(fn, 'wb') as f:
np.savetxt(f, vertsStack, fmt='%f %f %f %d %d %d ')
有关 CloudCompare 和链接的更多信息,请查看此问题: Point cloud XYZ format specification