2016-08-19 3 views
1

Я работаю над приложением для дизайна пола, где пользователь может импортировать текстуру пола, и приложение разместит текстуру на изображении комнаты. Мне удалось преобразовать перспективу изображения пола, чтобы он соответствовал изображению комнаты - благодаря этому answer, но теперь я застрял в масштабировании изображения пола, чтобы соответствовать размеру изображения комнаты. Я знаю реальные размеры деревянного пола (177 мм x 1220 мм на доску), я знаю высоту объекта в изображении комнаты (высота белой плитки около раковины составляет 240 мм), и я знаю расстояние между камерой и белым плитка (примерно 2500 мм). Размер изображения комнаты составляет 2592x1936, размер изображения на полу 1430x1220. Изображение комнаты было взято с iPad-камеры iPad, на которую я не могу найти информацию о фокусном расстоянии и размере датчика, ближайший я мог найти 3,3 фокусное расстояние с высотой датчика 3,6 мм (это может быть где я ошибаюсь).Изменение размера изображения с использованием измерений в реальном времени

Я попытался с помощью этого уравнения

Числа я подключен к уравнению, 2662 = (3,3 240 х 1936)/(160 х 3,6) Затем я попытался отработать высота объекта для деревянной доски в изображении пола, (3,3 x 1220 x 1936)/(2662 x 3,6) = 813 px Затем я разделил высоту изображения на высоту объекта, чтобы получить соотношение = 2.38.
Это изображение с коэффициентом 2.38, нанесенным на изображение пола, которое не совсем правильно. enter image description here

Я знаю, что я ошибаюсь где-то или идет полным неправильным способом, надеюсь, что кто-то может указать мне в правильном направлении. Спасибо

+0

Эта формула будет работать только для длины объекта, параллельной датчику камеры. Я бы использовал гомографию, которую вы, вероятно, уже использовали для текстурирования. Инвертируйте гомографию, чтобы получить отображение из пространства экрана в пространство текстуры. Затем вы можете сопоставить любой отрезок линии на полу в изображении с соответствующим представлением в координатах текстуры. Сравнивая полученную длину сегмента линии с целевой длиной, вы можете получить масштабирование вашей текстуры. –

ответ

1

Я бы протянул линии плитки, пока они не коснутся края, где задняя стена встречает пол. Используя эту технику, вы можете перенести длину от плоскости стены на равную длину в плоскости пола. Таким образом, в этот момент все, что вам нужно сделать, это длина совпадения вдоль одной строки, а именно длины между досками и длины между переданными точками. Но вы должны сделать это в соответствии с последовательностью. Наиболее универсальным инструментом для проективных измерений является поперечное отношение. Приложение, очень похожее на то, что у вас здесь, описано в How to calculate true lengths from perspective projection на Math SE. Если ваша точка исчезновения на этой линии, где стены встречаются, действительно находится на бесконечности (что, по-видимому, примерно соответствует вашему настройке), вы можете пройти с помощью более простых вычислений, но если вы не можете гарантировать, что это всегда будет так, Я не стал бы полагаться на это.

Вышеуказанное поможет вам отрегулировать масштаб в один руководство только. Однако направление, перпендикулярное этому, все еще открыто. В вашем случае, который будет направлением глубины, направление от камеры. У вас есть какие-то ориентиры для этого направления? Мне кажется, что вы можете использовать одну полную плиту на левой стене, прежде чем начнется окно. Но в зависимости от того, как угол между двумя стенами выложен плиткой, это может быть слегка отключено.

Illustration

Чтобы проиллюстрировать эти идеи, посмотрите на картинке выше. Поскольку красные линии выглядят почти горизонтальными, видя эффекты перспективы, довольно сложно. Поэтому я сделаю другое направление. Предположим, что плитка в углу действительно того же видимого размера, что и все остальные плитки на стене. Таким образом, вы знаете расстояние реального мира между A1 и B1. Вы проецируете вдоль синих вертикальных линий (вертикально в реальном мире, не обязательно изображение) до A2 и B2, где левая плоскость стены соответствует плоскости пола.

Почему они там встречаются? Ну, линии A1, A2 - это то, где слева все встречается с задней стенкой. Линия A2, A3 - это то, где задняя стенка соответствует полу. Оба этих плоских пересечения фактически видны, по крайней мере частично, что делает возможным рисование линий. Таким образом, на A2 все три плоскости встречаются и соединяют это с дальней точкой F, дает третий край, где левая стена встречает пол.

Поскольку сегменты A1, B1 и A2, B2 являются только вертикально транспортируемыми версиями друг друга в реальном мире, они имеют равную длину. Эта транспортировка была вдоль левой стены в вертикальном направлении. Теперь переместите их снова, на этот раз в плоскости пола и в левом-правом направлении. Вы делаете это, используя красные линии, которые либо параллельны, либо встречаются в точке (что довольно далеко в этом примере). Эти красные линии A2, A3 и B2, B3 параллельны в реальном мире, и их расстояние по-прежнему является краевой длиной этой плитки.

Теперь начните измерять что-либо, например. расстояние между C и D. Для этого вычислите поперечное отношение (F, A3; B3, C), которое выражает расстояние от A3 до C, выраженное в кратных расстоянию от A3 до B3, и используя F как точку в бесконечность. Сделайте то же самое для D, и тогда разница будет длиной от C до D, выраженной в кратных расстоянию от A3 до B3. Таким образом, расстояние между C и D составляет 4,44 длины кромок плитки в этом примере. Увеличьте изображение, чтобы оно соответствовало этому рисунку.

+0

Спасибо @MvG, прочитав вашу полезную ссылку, я думаю, что знаю, что мне нужно делать, я немного смущен, хотя из того, что мне нужно сделать, чтобы «переносить длину от плоскости стены до равной длины в плоскости пола» «Я протянул линии от плиток, где стена встречает пол, но не уверена, что я буду делать после этого? – WagglyWonga

+0

@WagglyWonga: Я добавил свой ответ, чтобы добавить пример. Надеюсь, это поясняет, как передавать длины между самолетами. – MvG

+0

Спасибо, теперь это имеет смысл. Тем не менее, если бы я был прав, я мог бы измерить ширину доски пола, где пол отвечает задней стенке, и он должен соответствовать ширине плитки, например. Ширина плитки составляет 320 мм, доска - 177 мм, ширина плитки в пикселях - 150, поэтому ширина доски в пикселях должна быть около 83? – WagglyWonga

Смежные вопросы