Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2012, 12:15   #1
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию Геометрическое преобразование изображения

Как из вот этого:



получить вот это:



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

Собственно, вопрос. Как сопоставить координаты точек трапеции координатам точек прямоугольника? Ведь координаты внутренней точки трапеции зависят от координат каждого из четырех ее углов...
Smogg вне форума Ответить с цитированием
Старый 28.12.2012, 12:43   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

См. "проективные преобразования".
Abstraction вне форума Ответить с цитированием
Старый 28.12.2012, 22:12   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Ага, значит только через векторы. И использовать принцип подобия из программы 7-го класса не катит.

То есть сначала вычислять угол поворота и масштабирование плоскости,
от этого получать координаты единичных векторов осей,
потом через операции с векторами получить координаты точки на повернутой плоскости,
отбрасываем ось Z и получаем координаты проекции,
потом создать матрицу соответствия координат точек трапеции точкам прямоугольника
и уже через эту матрицу отрисовывать картинку на экране (чтобы не просчитывать каждую точку снова и опять при каждом WM_PAINT).

// Ну, в псевдокоде все очевидно)

UPD: Или же векторы тут не при чем, а через сопоставление координат трапеции координатам прямоугольника получаем [3x3] матрицу "подобия", применив которую к точке исходной фигуры получим точку результирующей?

Последний раз редактировалось Smogg; 28.12.2012 в 22:56.
Smogg вне форума Ответить с цитированием
Старый 28.12.2012, 23:51   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

В интернете нашлась вот такая статья. Вроде неплохо описано.

Я могу изложить альтернативный подход, "художественный": пусть прямоугольник ABCD переходит в A'B'C'D'. Возьмём точки пересечения A'B' с C'D' (P) и A'D' с B'C' (Q). Линия PQ - это "горизонт": любое семейство параллельных прямых прообраза сходится в некоторую точку на нём (либо параллельно ему). С помощью этого правила легко перевести в образ любую точку, лежащую на пересечении пары выстраиваемых прямых.
Abstraction вне форума Ответить с цитированием
Старый 29.12.2012, 01:28   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
В интернете нашлась вот такая статья. Вроде неплохо описано.

Я могу изложить альтернативный подход, "художественный": пусть прямоугольник ABCD переходит в A'B'C'D'. Возьмём точки пересечения A'B' с C'D' (P) и A'D' с B'C' (Q). Линия PQ - это "горизонт": любое семейство параллельных прямых прообраза сходится в некоторую точку на нём (либо параллельно ему). С помощью этого правила легко перевести в образ любую точку, лежащую на пересечении пары выстраиваемых прямых.
Да, тоже мелькала мысль о нахождении точки через пересечения прямых. Но испугался дзена с пересечением параллельных прямых где-то в бесконечности.
А с другой стороны... Если взять за опорные точки пучков два смежных угла, то центр картинки просчитывается наверняка, а вот с краем, принадлежащем опорным точкам, может получится может стать что-то не то. Хотя для моих целей вполне можно отбросить десяток крайних пикселей исходной картинки, она все равно на порядок больше, так даже реализма добавится.
...Хм, исходную картинку еще можно обрезать, но с результирующей останется тот же самый вопрос - пересечение практически параллельных прямых. Или расчет треугольника высотой в 1 пиксель и шириной в триста - ничего страшного? Да, скорее всего точности float'a на это хватит...

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

Исходя из всего этого, пойду медитировать матрицы по ссылке, как более общий и универсальный принцип преобразований.

Пасиб)

UPD: Да, но ведь можно использовать все четыре угла как опорные точки пучков линий. Тогда одна половина трапеции рассчитывается от одной пары углов, а вторая от второй. Таким образом решается вопрос с краевой неопределенностью и можно обойтись знаниями геометрии на уровне 7-го класса вместе с банальной пропорциональностью.
Вопрос решен.

Последний раз редактировалось Smogg; 29.12.2012 в 02:40.
Smogg вне форума Ответить с цитированием
Старый 29.12.2012, 10:21   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
можно обойтись знаниями геометрии на уровне 7-го класса вместе с банальной пропорциональностью.
Не очень понял, что Вы хотели сказать. Имейте в виду, что проективное преобразование не сохраняет пропорции. Сохраняются только достаточно сложные отношения.
Abstraction вне форума Ответить с цитированием
Старый 29.12.2012, 21:26   #7
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

И правда...

Магия какая-то. Пропорции нету, а прямые остаются прямыми:

Думал, что хотя бы по краю сохраняется пропорция, а оказытца, что ни по краю ни где вообще пропорциональность не гарантирована.

Ладно, пошел читать DirectX )
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обработка изображения преобразование Фурье Ria Alva C++ Builder 0 06.06.2012 21:43
C++ Builder обработка изображения преобразование Фурье Ria Alva Помощь студентам 0 05.06.2012 20:31
обработка и преобразование изображения midiss C++ Builder 0 04.06.2012 14:52
Геометрическое распределение papoose Помощь студентам 0 21.05.2011 20:43
Среднее геометрическое SkuLLL Помощь студентам 1 12.12.2010 17:10