- PVSM.RU - https://www.pvsm.ru -

Калибровка камеры Intel RealSense d435 с помощью OpenCV2 и ROS

Всем привет!

Хочу поделиться опытом работы с камерой Intel RealSense, модель d435 [1]. Как известно, многие алгоритмы машинного зрения требуют предварительной калибровки камеры [2]. Так уж получилось, что мы на нашем проекте используем ROS для сборки отдельных компонентов автоматизированной интеллигентной системы. Однако, проштудировав русскоязычный интернет, я не обнаружил каких-либо толковых туториалов на эту тему. Данная публикация призвана восполнить этот пробел.

Необходимое программное обеспечение

Так как ROS работает на Unix системах, я буду исходить из того, что у нас доступна система Ubuntu 16.04. Я не буду описывать детальные подробности установки, лишь дам ссылки на соответствующие туториалы.

sudo apt-get install python-opencv

Установка драйверов RealSense

  1. Прежде всего, необходимо установить драйверы [5] для камеры.
  2. ROS-пакет для камеры находится тут [6]. На момент публикации последняя версия была 2.0.3. Чтобы установить пакет, необходимо скачать исходный код и распаковать его в домашней директории ROS. Далее, нам необходимо будет установить его:

catkin_make clean
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
echo "source path_to_workspace/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

Тестируем камеру

После того как мы установили камеру, нам необходимо убедиться что драйвера работают как надо. Для этого мы подключаем камеру через USB и запускаем демку:

roslaunch realsense2_camera demo_pointcloud.launch

Данная команда откроет ROS визуализацию, на которой можно будет увидеть облако точек [7], зарегистрированные в топике /camera/depth/color/points:

rviz

Калибровка камеры

Ниже представлена адаптированная версия туториала от OpenCV [8].

import numpy as np
import cv2
import glob

# критерий остановки калибровки
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# мы используем шахматную доску 8x6
objp = np.zeros((6*8,3), np.float32)
objp[:,:2] = np.mgrid[0:8,0:6].T.reshape(-1,2)

# массивы для хранения объектов и точек всех изображений
objpoints = [] # 3d объекты из реального мира
imgpoints = [] # 2d точки на плоскости изображения

images = glob.glob('/путь_к_изображениям/*.png')

for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# ищем углы шахматной доски
ret, corners = cv2.findChessboardCorners(gray, (8,6),None)

# как только точки найдены, мы добавляем обновляем массивы с объектами и точками
if ret == True:
objpoints.append(objp)
corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
imgpoints.append(corners2)

# рисуем точки и показываем финальное изображение
img = cv2.drawChessboardCorners(img, (8,6), corners2,ret)
cv2.imshow('img',img)
cv2.waitKey(500)

cv2.destroyAllWindows()

# калибрируем и сохраняем результаты
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
np.save('/path_to_images/calibration', [mtx, dist, rvecs, tvecs])

Для того, чтобы данный скрипт заработал, нам необходимы как минимум 10 изображений шахматной доски, полученные с нашей камеры. Для этого мы можем использовать, к примеру, ROS-пакет image_view [9] или любую другую программу, способную делать скриншоты с USB камеры. Снятые изображения следует поместить в любую папку. Пример изображения:

Chess table

После того, как мы исполним скрипт, результаты калибрования будут сохранены в файл
calibration.npy. Эти данные затем можно использовать следующим скриптом:

calibration_data = np.load('path_to_images/calibration.npy')
mtx = calibration_data[0]
dist = calibration_data[1]
rvecs = calibration_data[2]
tvecs = calibration_data[3]

Заключение

Мы смогли успешно откалибрировать камеру RealSense d435 с помощью OpenCV2 и ROS. Результаты калибровки можно использовать в таких приложениях, как трекинг объектов, маркеров aruco, алгоритмов дополненной реальности и многих других. В следующей статье, я хотел бы поподробнее остановиться на трекинге маркеров aruco.

Автор: trojan03

Источник [10]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/281596

Ссылки в тексте:

[1] модель d435: https://click.intel.com/intelr-realsensetm-depth-camera-d435.html

[2] калибровки камеры: https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%BB%D0%B8%D0%B1%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BA%D0%B0%D0%BC%D0%B5%D1%80%D1%8B

[3] Как установить: https://gist.github.com/arthurbeggs/06df46af94af7f261513934e56103b30

[4] ROS Kinetic: http://wiki.ros.org/kinetic/Installation/Ubuntu

[5] драйверы: https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md#installing-the-packages

[6] тут: https://github.com/intel-ros/realsense/releases

[7] облако точек: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D0%BA%D0%BE_%D1%82%D0%BE%D1%87%D0%B5%D0%BA

[8] туториала от OpenCV: http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html

[9] image_view: http://wiki.ros.org/image_view

[10] Источник: https://habr.com/post/412953/?utm_campaign=412953