Как получить калибровочные матрицы камеры? - PullRequest
0 голосов
/ 01 сентября 2018

Я сейчас экспериментирую с ORB SLAM 2 и стереокамерой, подобной этой . Я использую объективы 2,8 мм и опционально 3,6 мм с разрешением 640x480 пикселей для левой и правой камеры / изображения.

ORB SLAM 2 позволяет мне определить несколько параметров искажения / исправления с помощью файла настроек (* .yaml), например:

fx, fy, cx, cy
k1, k2, p1, p2

Я провел калибровку камеры OpenCV с использованием шахматной доски , как описано здесь (внутренние углы 9x7 и длина квадрата 70 мм). Позже я использовал эту программу автоматической калибровки от MRPT , которая дает мне те же результаты с меньшим количеством камней преткновения.

Однако ORB SLAM 2 позволяет мне определить эти дополнительные параметры для предварительного выпрямления изображений (если я правильно понимаю):

D: 1x5 Matrix -> Distortion Coefficients aquired from calibration (fx,fy,cx,cy) ?
K: 3x3 Matrix -> Intrinsic Matrix aquired from calibration (k1,k2,p1,p2,k3) ?
R: 3x3 Matrix -> Rectification Transformation ?
P: 3x4 Matrix -> New Projection Matrix ?

У меня следующие вопросы (пример файла settings.yaml см. Ниже):

A.) Верно ли мое предположение, что D - это distortion coefficients, а K - это intrinsic matrix, полученное в процессе калибровки шахматной доски?

B.) Определение fx, fy, cx, cy в settings.yaml достаточно для предварительной выпрямления изображений и успешной работы ORB SLAM 2?

C.) Нужны ли матрицы R и P для успешной работы ORB SLAM 2?

D.) Как я могу получить матрицы R и P? Процедура калибровки камеры OpenCV с шахматной доской не дает мне этих матриц, верно?

Вот пример вышеупомянутого settings.yaml файла ORB SLAM 2:

%YAML:1.0

#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 646.53807309613160
Camera.fy: 647.36136487241527
Camera.cx: 320.94123353073792
Camera.cy: 219.07092188981900

Camera.k1: -0.43338537102343577
Camera.k2: 0.46801812273859494
Camera.p1: 0.0039978632628183738
Camera.p2: 0.00023265675941025371

Camera.width: 640
Camera.height: 480

# Camera frames per second 
Camera.fps: 20.0

# stereo baseline times fx
Camera.bf: 38.76

# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1

# Close/Far threshold. Baseline times.
ThDepth: 50

#--------------------------------------------------------------------------------------------
# Stereo Rectification. Only if you need to pre-rectify the images.
# Camera.fx, .fy, etc must be the same as in LEFT.P
#--------------------------------------------------------------------------------------------
LEFT.width: 640
LEFT.height: 480
LEFT.D: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data:[-0.28340811, 0.07395907, 0.00019359, 1.76187114e-05, 0.0]
LEFT.K: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [458.654, 0.0, 367.215, 0.0, 457.296, 248.375, 0.0, 0.0, 1.0]
LEFT.R:  !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [0.999966347530033, -0.001422739138722922, 0.008079580483432283, 0.001365741834644127, 0.9999741760894847, 0.007055629199258132, -0.008089410156878961, -0.007044357138835809, 0.9999424675829176]
LEFT.P:  !!opencv-matrix
   rows: 3
   cols: 4
   dt: d
   data: [435.2046959714599, 0, 367.4517211914062, 0,  0, 435.2046959714599, 252.2008514404297, 0,  0, 0, 1, 0]

RIGHT.width: 640
RIGHT.height: 480
RIGHT.D: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data:[-0.28368365, 0.07451284, -0.00010473, -3.555907e-05, 0.0]
RIGHT.K: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [457.587, 0.0, 379.999, 0.0, 456.134, 255.238, 0.0, 0.0, 1]
RIGHT.R:  !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [0.9999633526194376, -0.003625811871560086, 0.007755443660172947, 0.003680398547259526, 0.9999684752771629, -0.007035845251224894, -0.007729688520722713, 0.007064130529506649, 0.999945173484644]
RIGHT.P:  !!opencv-matrix
   rows: 3
   cols: 4
   dt: d
   data: [435.2046959714599, 0, 367.4517211914062, -47.90639384423901, 0, 435.2046959714599, 252.2008514404297, 0, 0, 0, 1, 0]

#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------

# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 800

# ORB Extractor: Scale factor between levels in the scale pyramid   
ORBextractor.scaleFactor: 1.2

# ORB Extractor: Number of levels in the scale pyramid  
ORBextractor.nLevels: 8

# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast           
ORBextractor.iniThFAST: 12
ORBextractor.minThFAST: 3

#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize:2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500

1 Ответ

0 голосов
/ 07 октября 2018

По моему мнению, есть несколько наборов инструментов калибровки, используемых для калибровки монокулярных, стерео или мультикамер.

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

второе, что я недавно использовал, это Kalibr . Он не только предназначен для калибровки нескольких камер, но также может калибровать камеру и единицы измерения инерции (IMU) совместно.

Кроме того, вы также можете использовать MATLAB , чтобы получить внутренние параметры камеры.

Что касается ваших вопросов, вот мои несовершенные ответы.

Q.A: K(fx, fy, cx,cy) обозначает внутренние параметры камеры и коэффициенты искажения отдельно k1,k2,p1.p2.

Q.B: насколько мне известно, получения внутренних параметров, включая fx, fy, cx, cy, достаточно для запуска ORBSLAM2 с вашими собственными камерами.

Q.C & D, если вы решите использовать этот пакет ROS , в конце вы получите матрицу проекции и преобразование выпрямления.

...