Как интерпретировать матрицу деформаций OpenCV? [Дубликат]

Учитывая, что никто не упомянул об этом ...

Некоторые языки высокого уровня, такие как Python и Java, поставляются с инструментами для преодоления ограничений двоичной с плавающей запятой. Например:

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

7
задан slartidan 3 March 2016 в 20:35
поделиться

1 ответ

Вот математическое объяснение аффинного преобразования: это матрица размера 3x3, которая применяет преобразования foolowing на 2D-векторе: масштаб по оси X, scaleY, вращение, перекос, перевод по оси x и y. Это 6 преобразований, и поэтому у вас есть шесть элементов в вашей матрице 3x3. Нижняя строка всегда [0 0 1]. Зачем? потому что нижняя строка представляет собой перспективное преобразование по оси x и y, а аффинное преобразование не включает перспективное преобразование. (Если вы хотите применить перспективное деформирование, используйте гомографию: также матрица 3x3)

Какова связь между 6 значениями, которые вы вставляете в аффинную матрицу и с помощью 6 преобразований, которые она делает? Посмотрим на эту матрицу 3x3, такую ​​как

e*Zx*cos(a), -q1*sin(a)  ,  dx,
e*q2*sin(a),     Z y*cos(a),  dy,
0       ,            0  ,   1
  1. Элементы dx и
  2. dy - это перевод по оси x и y (просто переместите изображение влево-вправо, вверх вниз).
  3. Zx - относительный масштаб (масштабирование), который применяется к изображению по оси X.
  4. Zy является таким же, как указано выше для оси y
  5. a - угол поворота изображения. Это сложно, поскольку, когда вы хотите повернуть на «a», вам нужно вставить sin (), cos () в 4 разных местах в матрице.
  6. 'q' - это косой параметр. Он редко используется. Это заставит ваше изображение перекоситься сбоку (q1 заставляет ось y влиять на ось x, а q2 вызывает ось оси x для оси y)
  7. Бонус: параметр «e» на самом деле не является преобразованием. Он может иметь значения 1, -1. Если оно равно 1, то ничего не происходит, но если оно равно -1, то изображение переворачивается горизонтально. Вы также можете использовать его, чтобы перевернуть изображение по вертикали, но этот тип преобразования редко используется.

Очень важно Примечание !!!!!

Приведенное выше объяснение математическое. Предполагается, что вы умножаете матрицу на вектор столбца справа. Насколько я помню, Matlab использует обратное умножение (вектор строки слева), поэтому вам придется транспонировать эту матрицу. Я уверен, что openCV использует регулярное умножение, но вам нужно его проверить. Просто введите только матрицу перевода (x сдвинуто на 10 пикселей, y на 1).

1,0,10
0,1,1
0,0,1

Если вы видите нормальный сдвиг, чем все в порядке, но если появляется дерьмо, чем транспонирование матрицы:

1,0,0
0,1,0
10,1,1
11
ответ дан DanielHsH 31 August 2018 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: