• Opencv каким методом лучше искать контуры?

    @eugenebartosh
    Найти контуры можно только findContours, вопрос у вас в том как предварительно подготовить изображение. Canny в данном случай не подойдет, следует использовать blur + thresholding
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Вот забрел случайно сюда опять ))
    Если исходить из того, что ориентация камеры соответствует данным гироскопа мобильного устройства на момент фиксации кадра, то задача становится даже скучной и не требует никакой особенной библиотеки:
    - вектор направления для каждой точки к центру камеры вычисляется по ориентации камеры и пиксельным координатам точки;
    - по двум точками вычисляем точку пересечения прямых, заданных точкой начала и вектором направления - это и есть координаты центра камеры;
    Гироскоп дает достаточно точную ориентацию, по крайне мере на устройствах Apple и большинстве Android-смартфонов и таблеток, так что погрешность получается более чем приемлемая.
    И достаточно только двух точек, вычисления простейшие линейные.
    Ну и поскольку в реальности прямые не пересекутся из-за погрешностей - надо искать точку их минимального сближения, задача на 2 оператора сложнее
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Mrrl: в итоге метод не дал приемлемого результата в начальной итерации, так как все реперные точки начальной итерации расположены ко-планарно, то есть на 2D-метке, напечатанной на листе бумаги и положенной на пол. От этих точек и по положению камеры уже должны генерироваться другие точки методом триангуляции, но это уже другая история...
    Ко-планарное расположение точек провоцирует описанные degenerate cases. Даже в развитых пакетах типа OpenCV все degenerate cases данного метода не реализованы.
    Короче, я взял готовый пакет OpenCV, тут реализованы все 5 алгоритмов, в том числе рассмотренный нами P3P.
    Интересующихся отправляю к OpenCV, а также первоисточниками:
    EPNP - F.Moreno-Noguer, V.Lepetit and P.Fua "EPnP: Efficient Perspective-n-Point Camera Pose Estimation"
    P3P - X.S. Gao, X.-R. Hou, J. Tang, H.-F. Chang; "Complete Solution Classification for the Perspective-Three-Point Problem"
    DLS - Joel A. Hesch and Stergios I. Roumeliotis. "A Direct Least-Squares (DLS) Method for PnP"
    UPNP - A.Penate-Sanchez, J.Andrade-Cetto, F.Moreno-Noguer. "Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation"
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Mrrl: Мне представляется - корни скорей всего будут близкими, что следует и из геометрической иллюстрации задачи - расположена ли точка n на dZ ближе или дальше чем ее соседи по совокупности?

    Брать большое множество точек не хочется - все-таки вычислительная сложность алгоритма заметная, вычисление всех коэффициентов одного уравнения - это около тысячи операций сложения и умножения, система из 4-х ур для одной точки вместе с решением обратной матрицы - уже более 5 тыс операций, а должно работать в реальном времени на iPad / iPhone. Да и реперные точки еще надо где-то взять, особенно в первых итерациях.

    С другой стороны, в модели не используется важнейшее правило - то что центр камеры, точка в пространстве и проекция точки, находятся на одной прямой.
    Проекция точки может быть выражена в условных реальных координатах через пиксельные в соответствии с матрицами поворота камеры:
    C + (cos(Rz)*cos(Ry)*Ux - sin(Rx)*sin(Ry)*cos(Rz)-Uy*cos(Rx)*sin(Rz),
    sin(Rz)*cos(Ry)*Ux-sin(Rx)*sin(Ry)*sin(Rz)+Uy*cos(Rx)*cos(Rz),
    -Ux*sin(Ry)-cos(Ry)*sin(Rx) )
    где Rx,Ry,Rz - искомые значения углов поворота камеры (от положения по оси Z),
    С - искомый центр камеры,
    U вычисляется из пиксельных координат точки как (tg(uv.x-W/2)/W*fov_x,tg(uv.y-H/2)/H*fov_y))

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

    @eugenebartosh
    Mrrl: Расстоянию Z было уделено внимание в том ключе, как вы упомянули - иначе наверно не удалось бы получить и эти скромные пока но надеюсь обещающие результаты.

    Множественность не дает мне покоя тем не менее - она сидит в уравнениях теоремы косинусов, геометрически можно вот такую картинку сразу представить:
    d6a4752500d3463690b72eac14dc99ce.jpg
    Нетрудно заметить, что точки А3 и A3' удовлетворяют любым условиям теоремы косинусов, не просто в отдельной паре точек, но и в более сложной их совокупности (в данном случае 3 точки).
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Mrrl: Сказать что все гладко пока нельзя, работает не очень стабильно. Может погрешность вычислений накапливается, может сказывается дуализм решений полинома четной степени... из пяти точек обычно 3 определяются примерно нормально, 2 плавают - более близкая из двух точек может оказаться более далекой, или вообще точка вылетает за пределы сцены...

    Решение выполняется заменой переменных полинома a1*z^8 + a2*z^6 + a3*z^4 + a4*z^2 + a5 = 0 на z1 = z^8, z2 = z^6, z3 = z^4, z4 = z^2 и последующему вычислению обратной матрицы линейной системы, составленной из данных 5-ти точек.
    Для решения выполняются условия z3 ~= z4 * z4, z2 ~= z4*z4*z4, z1 != z4*z4*z4*z4 с погрешностью 5-20%. Редко бывает z1 < 0, еще реже - z2 < 0.
    В большинстве случаев z4 содержит довольно реалистичное значение, система ведет себя стабильно и реалистично при удалении-приближении, поворотах камеры и т.п. - расстояния больше-меньше, либо пропорции меняются при поворотах.

    Как вы думаете, дуализм (множественность) решения полинома четной степени может проявиться и как бы это разрулить?
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    eugenebartosh: В общем есть решение, получилось запрограммировать и отладить сравнительно легко - благо Maple сгенерил более 50% C-кода. Однако понадобилось 5 точек. 4, тем более 3 - мало. Хотя теоретически чисто достаточно 3-х.
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Mrrl: Получил многочлен, у меня он достаточно компактный, менее половины экрана (наверно шрифт просто поменьше:), если только четные степени - для преобразовании к линейной системе нужно также 4 уравнения и следовательно координаты 4х точек
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Mrrl: спасибо за ответ и за ликбез по Mapple! Дорожка оказывается уже проторена - computeroptics.smr.ru/KO/PDF/KO39-3/390317.pdf например, у них получается полином 4й степени от одной переменной с известной структурой коэффициентов, что сводит задачу к 4-м уравнениям (нужны координаты 4-х точек) и в конечном счете решению линейной системы.
  • Как найти положение камеры по трем точкам в пространстве?

    @eugenebartosh
    Спасибо за содержательный ответ по теме. Скажите, как вы получили в MAPLE полином размером на экран? При использовании solve({P1^2 = X1^2-2*cos(a1)*X1*X2+X2^2, P2^2 = X1^2-2*cos(a2)*X1*X3+X3^2, P3^2 = X2^2-2*cos(a3)*X2*X3+X3^2}, {X1, X2, X3}) получается невообразимой длины полином. Как-то по другому? Спасибо!