मेरे पास Intel RealSense कैमरे से एक गहराई फ्रेम है और मैं इसे पॉइंटक्लाउड में बदलना चाहता हूं और पॉइंटक्लाउड की कल्पना करना चाहता हूं। अब तक, केवल गहराई फ्रेम और कैमरा इंट्रिनिक्स दिए गए पॉइंटक्लाउड बनाने के लिए, मुझे निम्नलिखित दो कार्य मिले, हालांकि मुझे किसी एक की कल्पना करने या उन्हें .ply फ़ाइल के रूप में संग्रहीत करने का कोई तरीका नहीं मिल रहा है।

मुझे इस तरह से बनाए गए पॉइंटक्लाउड की कल्पना कैसे करनी चाहिए?

विधि 1:

pointcloud = convert_depth_frame_to_pointcloud(original_depth_frame, color_intrinsics)

जिसमें convert_depth_frame_to_pointcloud एक सहायक है RealSense से फ़ंक्शन

Open3D लाइब्रेरी का उपयोग करके विधि 2:

pcd = o3d.geometry.PointCloud.create_from_depth_image(original_depth_frame, color_intrinsics)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
print(np.asarray(pcd.points)[1, :])  
o3d.visualization.draw_geometries([pcd])

साथ ही, o3d का उपयोग करते समय, मुझे यह त्रुटि मिलती है:

create_from_depth_image(): incompatible function arguments. The following argument types are supported:
    1. (depth: open3d::geometry::Image, intrinsic: open3d.cuda.pybind.camera.PinholeCameraIntrinsic, extrinsic: numpy.ndarray[float64[4, 4]] = array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]]), depth_scale: float = 1000.0, depth_trunc: float = 1000.0, stride: int = 1, project_valid_depth_only: bool = True) -> open3d.cuda.pybind.geometry.PointCloud

यहां ओरिजिनल_डेप्थ_फ्रेम पढ़ा जाता है:

frame = cv2.imread(os.path.join(args.depth_input_dir, imgs_dir[frame_idx]), cv2.IMREAD_ANYDEPTH)

जहां एक गहराई की छवि इस प्रकार है:

000248.png PNG 1280x720 1280x720+0+0 16-bit Grayscale Gray 567278B 0.000u 0:00.000

जहां color_intrinsics है:

def set_intrinsics(intrinsics_dict):
    intrinsics = rs.intrinsics()
    intrinsics.width = intrinsics_dict['width']
    intrinsics.height = intrinsics_dict['height']
    intrinsics.ppx = intrinsics_dict['ppx']
    intrinsics.ppy = intrinsics_dict['ppy']
    intrinsics.fx = intrinsics_dict['fx']
    intrinsics.fy = intrinsics_dict['fy']
    intrinsics.model = intrinsics_dict['model']
    intrinsics.coeffs = intrinsics_dict['coeffs']
    return intrinsics
color_intrinsics = set_intrinsics(camera['color_intrinsics'])

Open3d का उपयोग करके मैं PNG प्रारूप में एक गहराई वाली छवि का पॉइंटक्लाउड बनाने में सक्षम हूं यदि मैं इसे opencv का उपयोग करके नहीं पढ़ता (हालाँकि मुझे अपने कोड के हिस्से के रूप में ऐसा करने की आवश्यकता है)।

import open3d as o3d
import matplotlib.pyplot as plt
import numpy as np

raw_depth = o3d.io.read_image('depth_images/000248.png')
pcd = o3d.geometry.PointCloud.create_from_depth_image(raw_depth, 
o3d.camera.PinholeCameraIntrinsic(
                                  o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)
                                , np.identity(4), depth_scale=1000.0, depth_trunc=1000.0)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
print(np.asarray(pcd.points)[1,:])
o3d.visualization.draw_geometries([pcd])

^^ उपरोक्त कोड एक 3D पॉइंटक्लाउड उत्पन्न करता है।

0
Mona Jalal 28 जिंदा 2021, 05:04

1 उत्तर

सबसे बढ़िया उत्तर

आपको अपनी छवि को इस प्रकार पढ़ना होगा:

import open3d as o3d
import matplotlib.pyplot as plt
import numpy as np

raw_depth = o3d.io.read_image('depth_images/000248.png')
pcd = o3d.geometry.PointCloud.create_from_depth_image(raw_depth, 
o3d.camera.PinholeCameraIntrinsic(
                                  o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)
                                , np.identity(4), depth_scale=1000.0, depth_trunc=1000.0)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
print(np.asarray(pcd.points)[1,:])
o3d.visualization.draw_geometries([pcd])
1
Mona Jalal 29 जिंदा 2021, 02:55