Подтвердить что ты не робот

Расстояние до объекта с помощью стереокамеры

Есть ли способ вычислить расстояние до конкретного объекта с помощью стереокамеры? Есть ли какое-либо уравнение или что-то, чтобы получить расстояние, используя несоответствие или угол?

4b9b3361

Ответ 1

ПРИМЕЧАНИЕ.. Все описанное здесь можно найти в книге Learning OpenCV в главах по калибровке камеры и стерео зрения. Вы должны прочитать эти главы, чтобы лучше понять следующие шаги.

Один подход, который не требует, чтобы вы сами измеряли все внутренние свойства камеры и внешние приложения, - это использовать функции калибровки openCV. Внутренние искажения камеры (искажения/искажения объектива и т.д.) Можно рассчитать с помощью cv:: calibrateCamera, в то время как внешность (соотношение между левой и правой камерой) может быть рассчитана с помощью cv:: stereoCalibrate. Эти функции принимают несколько точек в пиксельных координатах и ​​пытаются сопоставить их с координатами объектов реального мира. CV имеет аккуратный способ получить такие баллы, распечатать черно-белую шахматную доску и использовать функции cv:: findChessboardCorners/cv:: cornerSubPix для их извлечения. Необходимо сделать около 10-15 пар изображений шахмат.

Матрицы, рассчитанные с помощью функций калибровки, могут быть сохранены на диск, поэтому вам не нужно повторять этот процесс каждый раз, когда вы запускаете приложение. Здесь вы найдете несколько аккуратных матриц, которые позволят вам создать карту исправления (cv:: stereoRectify/cv:: initUndistortRectifyMap), которая впоследствии может быть применена к вашим изображениям с помощью cv:: remap. Вы также получаете аккуратную матрицу под названием Q, которая является матрицей различий в глубине.

Причина исправления ваших изображений заключается в том, что как только процесс будет завершен для пары изображений (при условии правильной калибровки), каждый пиксель/объект на одном изображении можно найти в той же строке на другом изображении.

Есть несколько способов, которыми вы можете перейти отсюда, в зависимости от того, какие функции вы ищете на изображении. Один из способов - использовать функции перезаписи CVs, такие как сопоставление Stereo Block или Semi Global Block Matching. Это даст вам карту несоответствий для всего изображения, которое может быть преобразовано в 3D-точки с использованием Q-матрицы (cv:: repjectImageTo3D).

Падение этого состоит в том, что, если в изображении не много текстурной информации, CV не очень-то хорош в построении плотной карты несоответствий (вы получите пробелы в ней, где она не сможет найти правильное несоответствие для данный пиксель), поэтому другой подход состоит в том, чтобы найти точки, которые вы хотите совместить. Скажем, вы находите объект/объект в x = 40, y = 110 в левом изображении и x = 22 в правом изображении (так как изображения исправлены, они должны иметь одинаковое значение y). Разница рассчитывается как d = 40-22 = 18.

Построим cv:: Point3f (x, y, d) в нашем случае (40, 110, 18). Найдите другие интересные точки таким же образом, а затем отправьте все точки в cv:: perspectiveTransform (с матрицей Q в качестве матрицы преобразования, по существу эта функция является cv:: reprojectImageTo3D, но для разреженных карт несогласованности), а вывод будет точек в XYZ-координатная система с левой камерой в центре.

Ответ 2

Я все еще работаю над этим, поэтому я не буду публиковать весь исходный код. Но я дам вам концептуальное решение.

В качестве входных данных (для обеих камер) вам понадобятся следующие данные:

  • положение камеры
  • интересующая камера (точка, на которой смотрит камера)
  • разрешение камеры (горизонтальное и вертикальное)
  • поле обзора углов обзора (горизонтальное и вертикальное)

Вы можете сами измерить последний, разместив камеру на листе бумаги и рисуя две линии и измеряя угол между этими линиями.

Камеры не обязательно должны быть выровнены, вам нужно только увидеть свой объект в обеих камерах.

Теперь вычислите вектор от каждой камеры к вашему объекту. У вас есть (X, Y) пиксельные координаты объекта с каждой камеры, и вам нужно вычислить вектор (X, Y, Z). Обратите внимание, что в простом случае, когда объект отображается прямо посередине камеры, решение будет просто (camera.PointOfInterest - camera.Position).

Как только у вас есть оба вектора, указывающие на вашу цель, линии, определенные этими векторами, должны пересекаться в одной точке идеального мира. В реальном мире они не будут из-за небольших ошибок измерения и ограниченного разрешения камер. Поэтому используйте ссылку ниже, чтобы рассчитать вектор расстояния между двумя строками.

Расстояние между двумя линиями

В этой ссылке: P0 - ваше первое положение кулачка, Q0 - ваше второе положение кулачка, u и v - векторы, начинающиеся с положения камеры и указывающие на вашу цель.

Вас не интересует фактическое расстояние, которое они хотят рассчитать. Вам нужен вектор Wc - мы можем предположить, что объект находится в середине Wc. Когда у вас есть позиция вашего объекта в 3D-пространстве, вы также получите любое расстояние, которое вам нравится.

Я скоро отправлю весь исходный код.

Ответ 3

У меня есть исходный код для обнаружения человеческого лица и возвращает не только глубину, но и координаты реального мира, когда левая камера (или правая камера, я не помню) была источником. Он адаптирован из исходного кода "Learning OpenCV" и относится к некоторым веб-сайтам, чтобы заставить его работать. Результат, как правило, довольно точен.