Как калибровать фокусное расстояние, перевод и вращение камеры, учитывая четыре пункта?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как калибровать фокусное расстояние, перевод и вращение камеры, учитывая четыре пункта?

Сообщение Anonymous »

Я пытаюсь найти фокусное расстояние, положение и ориентацию камеры в мировом пространстве. Таким образом (0, 0) является центром изображения. Я уже исправил для искажения линзы (используя коэффициенты k1 и k2 ), поэтому он не входит в картинку, за исключением иногда бросающих x или y немного из [-1, 1] диапазона. Четыре угла прямоугольника гарантированно будут видны и отмечены вручную на изображении. Например: < /p>

Код: Выделить всё

std::vector worldPoints = {
cv::Point3f(0, 0, 0),
cv::Point3f(2000, 0, 0),
cv::Point3f(0, 3000, 0),
cv::Point3f(2000, 3000, 0),
};
std::vector imagePoints = {
cv::Point2f(-0.958707, -0.219624),
cv::Point2f(-1.22234, 0.577061),
cv::Point2f(0.0837469, -0.1783),
cv::Point2f(0.205473, 0.428184),
};
< /code>

Эффективно, уравнение i  думать < /em> я пытаюсь решить (см. Эквивалент в документации OpenCV): < /p>

  / xi \   / fx    0 \ /        tx \ / Xi \
s | yi | = |    fy 0 | |  Rxyz  ty | | Yi |
\ 1  /   \       1 / \        tz / | Zi |
\ 1  /
< /code>

где: < /p>

[list]
[*]i
IS 1, 2, 3, 4
[*] -местоположение точки I в изображении (между -1 и 1)
[*] являются фокусными расстояниями камеры в направлении x и y
[*] - матрица вращения 3x3 камеры (имеет только 3 градуса свободы)
[*]

Код: Выделить всё

tx, ty, tz
- это перевод камеры
[*]

Код: Выделить всё

Xi, Yi, Zi
- это местоположение точки I в мировом пространстве (миллиметрах)
[/list]

, поэтому у меня есть 8 уравнений (по 4 балла по 2 координата каждая), и у меня есть 8 неизвестных (, rxyz , tx, ty, tz ). Поэтому я заключаю (за исключением патологических случаев), что должно существовать уникальное решение.

Код: Выделить всё

getPerspectiveTransform
работает, но дает мне только матрицу 3x3 (от 2D точек до 2D точек). Если бы я мог каким -то образом извлечь необходимые параметры из этой матрицы, это было бы здорово. < /Li>
< /ul>

Я также посмотрел на модуль Calib3d, который содержит несколько многообещающих функций, которые выполняют почти, но не совсем, что мне нужно: < /p>

Код: Выделить всё

initCameraMatrix2D< /code> звучит почти идеально, но когда я передаю его четыре очка, как это: < /p>

cv::Mat cameraMatrix = cv::initCameraMatrix2D(
std::vector({worldPoints}),
std::vector({imagePoints}),
cv::Size2f(2, 2), -1);
он возвращает мне матрицу камеры, которая имеет fx, fy set to -inf, inf .

Код: Выделить всё

calibrateCamera
, по -видимому, использует сложный решатель для работы с переопределенными системами и выбросами. Я все равно пробовал это, но все, что я могу получить от него, это сбои утверждений, подобные этим: < /p>

OpenCV(3.4.1) Error: Assertion failed (0 < /li>
< /ul>

Есть ли способ побудить OpenCV сделать то, что мне нужно? А если нет, как я мог сделать это вручную?

Подробнее здесь: https://stackoverflow.com/questions/506 ... our-points
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»