Алгоритм нахождения прямоугольного контура произвольного объекта.

Тема в разделе "WASM.ZEN", создана пользователем AlexBond, 1 окт 2008.

  1. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Собственно необходимо преобразовать заданный объект в специализированный формат.

    Каким способом можно реализовать Этап 3? См. на рисунке:

    http://www.worms3d-portal.com/images/3dobjToPox.swf

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

    Все это нужно для выполнения дальнейших этапов преобразования.

    С чего начать, и где рыть информацию?

    P.S. для начала надо найти способ реализации хотя бы для 2D, но все это нужно для работы с 3D объектом. Но думаю перейти будет просто, т.к. можно сплющить 3d объект матрицей и уже работать с 2d координатами. Правда понятия не имею как реализовать этап 3 в 3D...
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    AlexBond
    для начала - определи, что означает
    - вариантов может быть несколько, например среднеквадратичное отклонение :) а так - классическая задача линейной алгебры - ортогональное проектирование.
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Задача стандартная. Как уже сказано - метод наименьших квадратов, т.е. аппроксимация к прямой y=ax+b. Эта прямая будет проходить параллельно длинным сторонам прямоугольника и через середины коротких. Угол соответственно phi=arctg(a)
     
  4. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Вот тут есть, то, что нужно.
    http://www.softintegration.com/products/thirdparty/opencv/
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для выделения контура - слайсинг, затем определив максимумы и минимумы сделоть как сказал KeSqueer
     
  6. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    Спасибо, действительно метод наименьших квадратов очень подходит. Для 2D решили, а как быть с 3D?
    Надо найти прямую(проходящую через центр уже параллелепипеда, описывающего объект) в пространстве. Метод наименьших квадратов не подойдет....
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    AlexBond
    Через собственные числа/собственные вектора. Составляешь матрицу корреляции находишь собственные вектора к матрице. Записав вектора ввиде матрице будет тебе поворотная матрица. Остается повернуть и нати максимумы и минимумы. А если лень искать максимумы и минимумы то возьми собственные ичсла. Это диспермия.
    СКО будет корень из десперсии и умножем на 1,5 получишь контур с погрешностью 97%. Используя поиск максимув и минимув точно найдешь контур.

    В opencv должна быть функция так как операция с собственными векторами распростроненная.
     
  8. AlexBond

    AlexBond Member

    Публикаций:
    0
    Регистрация:
    30 янв 2005
    Сообщения:
    69
    Адрес:
    Belarus
    S_Alex
    Спасибо! Opencv это что-то, буду разбираться.
    Pavia
    Попробую и этот способ через собственные вектора, пока еще не сильно понял его, но буду рыть в этом направлении. Всем Спасибо за быстрые ответы!

    *****добавлено позже*******

    Спасибо еще раз за подсказку в напровлении пути, а именно за корреляцию. Она работает с удивительной точностью, правда я не составлял никакие матрицы из собственных векторов, я просто искал R >> 0 для всех вариантов от 0 до 90°. Для пространства я делал поиск для оси Z затем для оси Y затем для оси X, с соблюдением правильного поворота. В итоге я смог реализовать свой алгоритм по апокселяции 3d модели:
    3D Model >> Poxel
    [​IMG]