i am trying to find x,y,z from RGBD image. In place of data[u,v] i need to get D value from my RGBD image.
i am using formula:
Z = depth_image[v,u] / factor;
X = (u - cx) * Z / fx;
Y = (v - cy) * Z / fy;
where fx,fy,cx,cy are camera interior orientation parameters:
fx = focal length x
fy = focal length y
cx = optical center x
cy = optical center y
RGBD = RED,GREEN,BLUE,DEPTH depth image
import numpy as np
import open3d as o3d
from matplotlib import pyplot as plt
from PIL import Image
xyz = np.array([points[:, 0], points[:, 1], points[:, 2]]).T
XYZ = o3d.geometry.PointCloud()
XYZ.points = o3d.utility.Vector3dVector(xyz)
visZ = o3d.visualization.Visualizer()
visZ.create_window(width=1980, height=1080)
visZ.add_geometry(XYZ)
view_control = visZ.get_view_control()
camera_parameters = view_control.convert_to_pinhole_camera_parameters()
print("# Initial camera parameters\n{}\n{}".format(camera_parameters.extrinsic, camera_parameters.intrinsic.intrinsic_matrix))
intri = camera_parameters.intrinsic.intrinsic_matrix
extri = camera_parameters.extrinsic
visZ.run()
image1 = visZ.capture_depth_float_buffer()
photo_save = np.asarray(image1)
plt.imsave("testov.png", \
np.asarray(photo_save), dpi=1)
plt.imshow(np.asarray(photo_save))
plt.close()
plt.show()
visZ.destroy_window()
image = Image.open('testov.png')
size = w,h = image.size
print("imagesize",size)
data =image.load()
depthscale = 1000
for u in range(w):
for v in range(h):
Z = depth_image[v,u] / depthscale
x = (u - intri[0,2]) * data[u,v]/ intri[0,0]
y = (v - intri[1,2]) * data[u,v]/ [1,1]
print(data[x, y, z])