Как получить координату оси z из файла слоя для заданной точки ( x, y ) в python?

#python #object-detection #point-cloud-library #yolov5 #ply-file-format

Вопрос:

Я надеюсь, что это застанет вас в добром здравии. Я действительно новичок в работе с 3d-объектами. В последнее время я работаю с алгоритмом обнаружения объектов (YOLO). Поскольку Yolo возвращает координаты ограничивающей рамки объекта, мы можем легко получить координаты (x,y) ограничивающих рамок. Однако недавно я добавил в проект камеру TOF, которая может определять dept(координату оси z) для каждого пикселя. Все эти данные хранятся в соответствующем «.ply». Я хочу получить значение оси z для каждой координаты ограничивающей рамки, которую выводит yolo.

Прямо сейчас мой файл .ply показывает этот вывод:

 array([[-818.5 , -830.75, 1949.25],
       [-748.  , -814.5 , 1918.5 ],
       [-704.  , -806.75, 1905.25],
       ...,
       [ 903.75,  790.  , 1844.25],
       [ 906.75,  789.5 , 1843.  ],
       [ 915.  ,  793.75, 1852.25]], dtype=float32)
 

Я использую библиотеку plyfile python для чтения данных из моего файла .ply

Вот как далеко я зашел:

 def read_ply(filename):
    """ read XYZ point cloud from filename PLY file """
    plydata = PlyData.read(filename)
    x = np.asarray(plydata.elements[0].data['x'])
    y = np.asarray(plydata.elements[0].data['y'])
    z = np.asarray(plydata.elements[0].data['z'])
    return np.stack([x,y,z], axis=1)

coors =  read_ply("test.ply")
coors
 

Этот скрипт считывает данный файл .ply и выводит следующие значения вершин (x,y,z) из файла ply:

 array([[-818.5 , -830.75, 1949.25],
       [-748.  , -814.5 , 1918.5 ],
       [-704.  , -806.75, 1905.25],
       ...,
       [ 903.75,  790.  , 1844.25],
       [ 906.75,  789.5 , 1843.  ],
       [ 915.  ,  793.75, 1852.25]], dtype=float32)
 

Теперь я хочу найти ось z для соответствующих пикселей, которые присутствуют в ограничивающем поле, которое выводит YOLO.

Ответ №1:

Наконец-то понял, что я делал не так. Это правильный рабочий код. Ура!

 #Enter your x amp; y coors to get corresponding z-axis value

x =  2300          
y =  1822     

xy = np.array([x, y])
z = coors[np.all(np.isclose(coors[:, :2], xy), axis=1), 2][0]
print("x= {}  y= {}  z= {}".format(x, y, z))