Для своей диссертации я работаю над проектом компьютерного зрения. Частично это связано с множеством преобразований координат, с которыми я сейчас борюсь. Я просто не могу вращать свою систему координат по произвольной оси.
Я начинаю с 3D координат объекта. Учитывая, что я настроил камеру, знаю матрицу камеры и коэффициенты искажения, я могу спроецировать эту точку обратно на 2D-изображение.
Теперь я хочу получить эйлеровы углы системы координат так, чтобы ось Z системы координат указывает прямо на оптический центр (камеру).
Для полноты картины здесь приведены вспомогательные функции из моего кода. Для решения моей основной проблемы перейдите к следующему текстовому блоку.
Первая часть системы работает хорошо. Я могу установить трехмерные координаты, определить углы X и Y и напечатать соответствующую систему координат, ось Z которой направлена к камере, как и ожидалось (ось Z «исчезает» на графике).
[[0.09966865 0.16514868 0. ]]
Тестовые углы извлечения: (0.09966865249116204, 0.1651486774146268, 0.0)
Тестовая печать также показывает, что преобразование углов из матрицы вращения работает.
Теперь я хочу повернуть эту систему координат. вокруг своей новой оси Z. Эта ось Z, конечно, больше не совпадает с осью Z камеры, поскольку она была повернута в результате предыдущего вращения.
Поэтому я сначала получаю новую ось вращения, а затем создаю соответствующее вращение. матрицу для поворота на 45 градусов, объедините две матрицы поворота, получите углы Эйлера из объединенной матрицы поворота и постройте новую повернутую систему координат.
По какой-то причине это не работает. На новом графике оси X и Y выглядят нормально, но кажется, что вращение вокруг повернутой оси Z не было выполнено с первого поворота, потому что теперь эта ось снова видна. Похоже, что вращение происходило вокруг оси Z камеры, а не вокруг нее.
Есть ли ошибка в моем конвейере? Почему второй поворот не выполняется вокруг отдельно изготовленной оси?
С уважением,
Феликс
Для своей диссертации я работаю над проектом компьютерного зрения. Частично это связано с множеством преобразований координат, с которыми я сейчас борюсь. Я просто не могу вращать свою систему координат по произвольной оси. Я начинаю с 3D координат объекта. Учитывая, что я настроил камеру, знаю матрицу камеры и коэффициенты искажения, я могу спроецировать эту точку обратно на 2D-изображение. Теперь я хочу получить эйлеровы углы системы координат так, чтобы ось Z системы координат указывает прямо на оптический центр (камеру). Для полноты картины здесь приведены вспомогательные функции из моего кода. Для решения моей основной проблемы перейдите к следующему текстовому блоку. [code]def coordinate_system_to_image(image, custom_rotation, custom_translation): origin_3d = np.array([(0.0, 0.0, 0.0)]) start_point_coord, jacobian = cv2.projectPoints(origin_3d,custom_rotation,custom_translation,mtx,dist,)
degz_reverse1 = np.arctan2(r21/np.cos(degy_reverse1), r11/np.cos(degy_reverse1)) degz_reverse2 = np.arctan2(r21/np.cos(degy_reverse2), r11/np.cos(degy_reverse2)) print(f"Extracted Eulers 2: X:({degx_reverse1},{degx_reverse2}) Y:({degy_reverse1},{degy_reverse2}) Z:({degz_reverse1},{degz_reverse2})") return degx_reverse1, degy_reverse1, degz_reverse1 [/code] Первая часть системы работает хорошо. Я могу установить трехмерные координаты, определить углы X и Y и напечатать соответствующую систему координат, ось Z которой направлена к камере, как и ожидалось (ось Z «исчезает» на графике). [code]demo = np.zeros((2988, 5312, 3)) demo = np.uint8(demo)
[[0.09966865 0.16514868 0. ]] Тестовые углы извлечения: (0.09966865249116204, 0.1651486774146268, 0.0) Тестовая печать также показывает, что преобразование углов из матрицы вращения работает. Теперь я хочу повернуть эту систему координат. вокруг своей новой оси Z. Эта ось Z, конечно, больше не совпадает с осью Z камеры, поскольку она была повернута в результате предыдущего вращения. Поэтому я сначала получаю новую ось вращения, а затем создаю соответствующее вращение. матрицу для поворота на 45 градусов, объедините две матрицы поворота, получите углы Эйлера из объединенной матрицы поворота и постройте новую повернутую систему координат. [code]world_point_z_axis = np.array([0,0,1]) second_axis = np.matmul(M_rot, world_point_z_axis) # equals M_rot @ world_point_z_axis
demo2 = coordinate_system_to_image(demo2, custom_rotation=new_rotation, custom_translation=custom_translation) [/code] По какой-то причине это не работает. На новом графике оси X и Y выглядят нормально, но кажется, что вращение вокруг повернутой оси Z не было выполнено с первого поворота, потому что теперь эта ось снова видна. Похоже, что вращение происходило вокруг оси Z камеры, а не вокруг нее. [img]https://i.sstatic.net/Wx7cWKzw.png [/img]
Есть ли ошибка в моем конвейере? Почему второй поворот не выполняется вокруг отдельно изготовленной оси? С уважением, Феликс
В Python я пытаюсь построить карты всего неба в проекции Моллвейде. Я хочу иметь возможность показывать карты с произвольно повернутыми координатами и координатной сеткой. Для иллюстрации см. следующее общее изображение сетки (сгенерированное в...
В Python я пытаюсь построить карты всего неба в проекции Моллвейде. Я хочу иметь возможность показывать карты с произвольно повернутыми координатами и координатной сеткой. Для иллюстрации см. следующее обычное изображение сетки (сгенерированное в...
Мой вопрос касается нескольких повернутых панелей поиска. Идея, которую я придумал, состоит в том, чтобы создать квадрат из полос поиска со значениями от 0 до 5, где значение 5 панели поиска 1 касается значения 0 панели поиска 2 и так далее. Нашел...