Мне удалось найти решение моей проблемы. Это волшебный длинный алгоритм переполнения стека, но неся со мной. Идея заключается в том, чтобы написать вектор XY серых точек шкалы как файл pgm.
Шаг 1:cloud_to_greyscale
- функция, которая преобразует XYZ точки помутнения в вектора XY серой шкалы точек и что получает cloud
в качестве параметра:
for each point pt in cloud
point_xy_greyscale.x <- pt.x
point_xy_greyscale.y <- pt.y
point_xy_greyscale.greyscale <- map(pt.z, z_min, z_max, 0, 255)
greyscale_vector.add(point_xy_greyscale)
loop
return greyscale_vector
Шаг 2:greyscale_to_image
- функция, которая записывает ранее возвращенный вектор как greyscale_image
, класс, который имеет width
, a height
и _pixels
член, соответствующий двумерному массиву unsigned short
обычно. Функция получает следующие параметры: a greyscale_vector
(для преобразования в изображение) и x_epsilon
, которые помогут нам определить координаты пикселя x
для наших точек, зная, что координаты точки x
являются поплавками (и, следовательно, не подходят в качестве индексов массивов) ,
Немного предыстории информация: Я работаю на то, что называется widop облака так в моем 3D пространстве x
является width
, y
является depth
и z
является height
. Также стоит отметить тот факт, что y
является integer
, поэтому для моей проблемы height
изображения легко найти: это y_max - y_min
. Чтобы найти изображение width
, следуйте приведенному ниже алгоритму, и если это не ясно, я отвечу на любые вопросы, и я открыт для предложений.
img_width <- 0; // image width
img_height <- y_max - y_min + 1 // image height
// determining image width
for each point greyscale_xy_point in greyscale_vector
point_x_cell <- (pt.x - x_min) * x_epsilon * 10
if point_x_cell > img_width
img_width <- point_x_cell + 1
loop
// defining and initializing image with the calculated height and width
greyscale_img(img_width, img_height)
// initializing greyscale image points
for y <- 0 to greyscale_img.height
for x <- 0 to greyscale_img.width
greyscale_img[y][x] = 0
loop
loop
// filling image with vector data
for each point point_xy_greyscale in greyscale_vector
image_x = (point_xy_greyscale.x - x_min) * x_epsilon * 10
image_y = point_xy_greyscale.y - y_min
greyscale_image[image_y][image_x] = point_xy_greyscale.greyscale
loop
return greyscale_image
Единственное, что осталось сделать, это записать изображение в файл, но это легко сделать, вы можете просто найти правила форматирования в предыдущей ссылке, связанной с МПГ формата. Я надеюсь, что это помогает кому-то.
EDIT_1: Я добавил изображение результата. Предполагается, что это железная дорога, и причина, по которой довольно мрачная, заключается в том, что есть некоторые объекты, которые являются высокими, поэтому наземные объекты темнее.
depth image of railway
Может быть, просто масштабировать координаты и сложить полутоновые значения, если несколько точек лежат на один пиксель? –
Привет, я имел это в виду, но давайте рассмотрим это.Одна строка облака равна 3600 точкам, а одна строка изображения равна 1680 пикселям. Результат будет 2,41 балла за пиксель. Могу ли я просто пойти с 2 пунктами на пиксель и заполнить незанятые пиксели 0s? –
Неясно, плотно ли ваше облако точек. Тем не менее, когда несколько точек попадают в один и тот же пиксель, я бы взял значение z ближайшего, как если бы вы растрировали их. Поэтому, если вы не хотите выполнять эту задачу вручную, просто отправьте свои баллы, чтобы сказать OpenGL, и пусть они растеризуют их для вас, а затем зачитают буфер глубины. – masterxilo