2016-05-04 4 views
1

Для моей работы я должен преобразовать облако точек в изображение с серой шкалой (глубиной), что означает, что координата z каждой точки XYZ в облаке представляет собой оттенок серого. Для отображения координаты Z. из [z_min, z_max] интервал до интервала [0..255] Я использовал функцию картографическое Arduino:Как преобразовать 3D-облако точек в изображение глубины?

float map(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min)/(in_max - in_min) + out_min; }

Сделав это, мне нужно, чтобы записать результат на образ, проблема в том, что облака, которые у меня есть, могут иметь миллионы точек, поэтому я не могу просто написать их 1 к 1 изображению в порядке. Предположим, что у меня 3000 x 1000 экземпляров XY. Как мне сделать, если я захочу записать их на изображение размером 700 × 300 пикселей? Надеюсь, этот вопрос будет ясен, заранее за ответ.

+0

Может быть, просто масштабировать координаты и сложить полутоновые значения, если несколько точек лежат на один пиксель? –

+0

Привет, я имел это в виду, но давайте рассмотрим это.Одна строка облака равна 3600 точкам, а одна строка изображения равна 1680 пикселям. Результат будет 2,41 балла за пиксель. Могу ли я просто пойти с 2 пунктами на пиксель и заполнить незанятые пиксели 0s? –

+0

Неясно, плотно ли ваше облако точек. Тем не менее, когда несколько точек попадают в один и тот же пиксель, я бы взял значение z ближайшего, как если бы вы растрировали их. Поэтому, если вы не хотите выполнять эту задачу вручную, просто отправьте свои баллы, чтобы сказать OpenGL, и пусть они растеризуют их для вас, а затем зачитают буфер глубины. – masterxilo

ответ

0

Мне удалось найти решение моей проблемы. Это волшебный длинный алгоритм переполнения стека, но неся со мной. Идея заключается в том, чтобы написать вектор 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

+0

Какова ваша функция карты в вашем ответе? – Ehsan