#opencv #unity3d
#opencv #unity3d
Вопрос:
У меня есть преобразование из маркера Aruco, и я хотел бы получить позу камеры, используя эту информацию. Как я могу обновить позу камеры, используя только преобразование из маркера Aruco.
Я хотел бы сделать эту оценку в Unity, но я не уверен, как это сделать.
Комментарии:
1. с opencv вы можете использовать функцию solvePnP, чтобы получить позу объекта относительно камеры. Чтобы получить позу камеры относительно объекта, используйте обратный результат. Возможно, вам придется выполнять преобразование между разными системами координат в Unity и OpenCV
Ответ №1:
https://github.com/flankechen/ArUco_Unity
Раньше я делал plungin для Unity, используя Aruco для AR. Матрицы просмотра модели из Aruco достаточно для позы камеры. В коде c # я получаю левостороннюю трансформацию в родном Aruco для opengl, преобразую ее в правостороннюю для Unity, инвертирую и получаю положение и поворот для установки камеры Unity. проверьте https://github.com/flankechen/ArUco_Unity/blob/master/RenderingPluginExample52_ArUco_unity/UnityProject/Assets/UseRenderingPlugin.cs подробнее. «Крутая» часть — это перенос с левой системы на правую. не весь «код Google» работает.
//reform a left handed system transform matrix from right handed
public static Matrix4x4 LHMatrixFromRHMatrix(Matrix4x4 rhm)
{
Matrix4x4 lhm = new Matrix4x4();;
// Column 0.
lhm[0, 0] = rhm[0, 0];
lhm[1, 0] = rhm[1, 0];
lhm[2, 0] = -rhm[2, 0];
lhm[3, 0] = rhm[3, 0];
// Column 1.
lhm[0, 1] = rhm[0, 1];
lhm[1, 1] = rhm[1, 1];
lhm[2, 1] = -rhm[2, 1];
lhm[3, 1] = rhm[3, 1];
// Column 2.
lhm[0, 2] = -rhm[0, 2];
lhm[1, 2] = -rhm[1, 2];
lhm[2, 2] = rhm[2, 2];
lhm[3, 2] = -rhm[3, 2];
// Column 3.
lhm[0, 3] = rhm[0, 3];
lhm[1, 3] = rhm[1, 3];
lhm[2, 3] = -rhm[2, 3];
lhm[3, 3] = rhm[3, 3];
return lhm;
}