pybullet与peract获取数据集
pybullet中的数据如何在peract中使用
·
应伟大的学术显圣真君要求,本人开始对自己的工作进行记录
本文章只是用于本人的工作记录以方便将来的报告撰写如有需要引用可以与本人联系
首先获取数据集
在pybullet中可以添加摄像头获取rgbd和mask信息
def setCameraPicAndGetPic(self,b_pos,c_pos,width : int = 128, height : int = 128, physicsClientId : int = 0):
print("type(b_pos):",type(b_pos))
'''
b_pos = np.array([-1,0,1.5])
c_pos = np.array([0.5,0,0])
'''
# 从四元数中获取变换矩阵,从中获知指向(左乘(1,0,0),因为在原本的坐标系内,摄像机的朝向为(1,0,0))
#matrix = p.getMatrixFromQuaternion(b_ori, physicsClientId=physicsClientId)
#tx_vec = np.array([matrix[0], matrix[3], matrix[6]]) # 变换后的x轴
#tz_vec = np.array([matrix[2], matrix[5], matrix[8]]) # 变换后的z轴
basePos = b_pos
tPos = c_pos
tz_vec = np.array([0, 0,1]) # 变换后的z轴
viewMatrix = p.computeViewMatrix(
cameraEyePosition=basePos,
cameraTargetPosition=tPos,
cameraUpVector=tz_vec,
physicsClientId=physicsClientId
)
projectionMatrix = p.computeProjectionMatrixFOV(
fov=50.0, # 摄像头的视线夹角
aspect=1.0,
nearVal=0.01, # 摄像头焦距下限
farVal=1000, # 摄像头能看上限
physicsClientId=physicsClientId
)
'''
width, height, rgbImg, depthImg, segImg = p.getCameraImage(
width=width, height=height,
viewMatrix=viewMatrix,
projectionMatrix=projectionMatrix,
physicsClientId=physicsClientId,
renderer=p.ER_BULLET_HARDWARE_OPENGL
)'''
width, height, rgbImg, depthImg, segImg = p.getCameraImage(128,128,
viewMatrix=viewMatrix,
projectionMatrix=projectionMatrix,
physicsClientId=physicsClientId,
renderer=p.ER_BULLET_HARDWARE_OPENGL )
#print(type(rgbImg),len(rgbImg),width*height*4)
#self.display_images(rgbImg, depthImg,height,width)
#print(depthImg)
return width, height, rgbImg, depthImg, segImg
注意这里的所有图像都是1维的np数组也就是说如果想要获取正确的图像需要进行处理
以下是我进行处理的一些办法
1RGB图像
pybullet返回的信息为rgba信息也就是说假如一个图像有h行w列那么他的维度就是1*(h*w*4)
我们可以使用numpy的reshape方式来重新排布注意如果想要使用opencv需要把rgb转为bgd即
rgb_image[..., [0, 2]] = rgb_image[..., [2, 0]]否则颜色会混
def display_images_3x3(rgb_img,height,width):
# 从PyBullet的RGB元组中提取RGB部分
print("len(rgb_img)",len(rgb_img))
#print(depth_img)
# 逐个像素处理图像
rgb = np.zeros((height, width, 3), dtype=np.uint8)
count = 0
rgba_image = rgb_img.reshape((128, 128, 4))
rgb_image = rgba_image[:,:,0:3]
rgb_image[..., [0, 2]] = rgb_image[..., [2, 0]]
#rgb_image = cv2.cvtColor(rgba_image, cv2.COLOR_RGBA2BGRA)
'''
for i in range(height):
for j in range(width):
# 以示例,将每个像素设置为随机颜色
print("i,j",i,j)
print("count:",count)
pixel_color = (int(rgb_img[count+2]),
int(rgb_img[count+1]),
int(rgb_img[count]))
#print(dep)
#print(int(depth_img[int(count/4)]))
rgb[i, j] = pixel_color
count+=4'''
#cv2.imshow('rgb Image', rgb_image)
#cv2.waitKey()
return rgb_image
效果
2mask信息
mask中的数值都是int类型的整数,为了可以在图像中反映出来可以将其乘以一个固定的系数
def make_and_save_mask_img(Img,name):
Img = Img.reshape(128, 128)
print(Img)
'''
rgb,dep = display_images(base_rgbImg,base_depthImg,128,128)
print(len(base_depthImg))
'''
segImg = Image.fromarray(
(Img * 50).astype(np.uint8))
segImg.save(
os.path.join('images/'+name+'/', str(i)+".png"))
#cv2.imwrite('images/dep/'+str(i)+".png", dep)
3深度信息处理
注意这里为了与rlbench结合需要使用rlbench中的解码方式在查询peract的文件中法下如下信息
right_shoulder_depth = utils.float_array_to_rgb_image(
obs.right_shoulder_depth, scale_factor=DEPTH_SCALE)
我们这里用同样的解码方式先把pybullet的深度信息(0,1)转为线性的float信息再将float信息转为rgbimage
def make_and_save_depth_img(base_depthImg,name):
# 投影矩阵中的近裁剪面和远裁剪面
near = 0.01
far = 1000
# 转换深度缓冲区值为线性深度值
linear_depth_array = far * near / (far - (far - near) * base_depthImg)
dep = linear_depth_array.reshape(128, 128)
print(dep)
'''
rgb,dep = display_images(base_rgbImg,base_depthImg,128,128)
print(len(base_depthImg))
'''
overhead_depth = utils.float_array_to_rgb_image(
dep, scale_factor=DEPTH_SCALE)
#dep = utils.float_array_to_rgb_image(dep,128,128)
overhead_depth.save(
os.path.join('images/'+name+'/', str(i)+".png"))
#cv2.imwrite('images/dep/'+str(i)+".png", dep)

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)