Как построить 3D модель, используя плоскость и линию?
Прошу помочь советом - как можно сделать обработку изображения для построения по ней 3D модели.
Я понимаю процесс так: допустим, есть модель, которую освещает ярко-зеленая (тонкая) линия. Изображение захватывается на прямую с камеры, далее просматривается каждый пиксель на изображении слева направо и сверху вниз ищется зеленый пиксель, далее запоминаются координаты всех зеленых пикселей как точек в 2D (2-мерный массив) пространстве с текущего изображения, затем захватывается следующее изображение, на котором положение зеленых точек слегка изменено, а дальше...
...а дальше я просто не представляю, как реализовать соединение предыдущих точек с текущими для преобразования в первую частичку 3D модели
ЯП: Java или Delphi
Соединяются точки, находящиеся либо на соседних строках матрицы на одном кадре, либо на одной и той же строке на соседних кадрах. В результате получается сетка из четырёхугольников. Их можно разделить на треугольники по более короткой диагонали.
Если на какой-нибудь строке зелёной точки не найдётся - в модели будет дырка.
Сергей Протько: Может быть, и не надо. Очень вероятно, что освещённая часть модели на этом кадре не видна с точки расположения камеры - а значит, данных про этот участок просто нет. Заклеивать дырки надо уже на следующих этапах обработки - например, при склейке фрагментов, полученных с разных сторон.
Nagoran: Подробнее. Пусть m - номер кадра, k - номер строки матрицы, s_mk - x-координата зелёного пикселя на этой строке этого кадра. Вычисляете 3D координаты точки P_mk=(x_mk,y_mk,z_mk), используя направление полосы для m-го кадра, взаимное расположение камеры и проектора, и параметры самой камеры. После этого выдаёте поверхность, состоящую из четырёхугольников (P_mk,P_m,k+1,P_m+1,k+1,P_m+1,k). Возможно, некоторые грани вам не понравятся - они будут слишком вытянутыми. Тогда надо ввести ограничение на длину ребра модели и выбросить грани со слишком длинными рёбрами.
Возможно, Ваш комментарий простой как валенок, для человека сведущего в этой области, но, к сожалению, для меня в этой ситуации сродни "как нарисовать сову: рисуем овал - дорисовываем все остальное".
Дорисовать грани - т.е. надо объединить две матрицы исходная и текущая. В исходную дописать новые значения, получится одна большая матрица точек. Которые будут соединяться векторами. Но они двумерные. А чтобы построить 3D нужна же 3-я координата.
Nagoran: алгоритм такой:
- что бы построить 3D объект можно составить массив срезов и затем объеденить все кривые в 3D модель.
- под срезом мы имеем в виду плоскость, проходящую через объект. Пустив луч лазера (зеленая линия о которой говорит автор) мы получим точки пересечения поверхности объекта с плоскостью
- с одного кадра мы можем получить один срез, координаты можно посчитать так как нам известны как и размеры сцены, так и угл между камерной и плоскостью которую мы проэцируем.
- затем мы поворачиваем на определенный угл объект и повторяем процедуру пока не получим все срезы поверхности - двухмерный массив координат точек.
Далее уже идут варианты, можно построить по точкам кривые, закрывая дырки за счет интеполяции и имея эти самые кривые узнать координаты в любой координате (мы пока только с 2D работаем).
зная углы и т.д. мы можем расположить кривые как тело вращения, и затем построчно построить 3D модель (так же задействуя аппроксимацию координат точек для более правдоподобной геометрии).
Сергей Протько: Интересно, почему вы решили, что мы поворачиваем объект, а не проектор. Оба варианта имеют право на существование и часто встречаются. Впрочем, есть и третий - когда проектор с камерой свободно движутся относительно модели, а их положение получается какими-то дополнительными средствами.
Хотя алгоритм от этого не меняется. Просто в случае объекта на поворотном столике надо ещё применить обратное преобразование поворота, чтобы получить координаты точек в локальной системе координат объекта.
Что значит "расположить кривые как тело вращения" мне понять не удалось.