slides calibration
TRANSCRIPT
OpenCV and firewire camera
Camera Calibration
Luis Baumela, Juan Bekios-Calfa
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Outline
I Camara calibration
I Homography estimate
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
I http://opencv.willowgarage.com/documentation/python/camera calibration and 3d reconstruction.html
I The functions in this section use the so-called pinhole cameramodel. That is, a scene view is formed by projecting 3D pointsinto the image plane using a perspective transformation.
I sm′ = A[R|t]M ′
I
s
uv1
=
fx 0 cx0 fy cy0 0 1
r11 r12 r13 t1r21 r22 r23 t2r31 r22 r33 t3
XYZ1
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
I Where (X ,Y ,Z ) are the coordinates of a 3D point in theworld coordinate space.
I (u, v) are the coordinates of the projection point in pixels.
I A is called a camera matrix, or a matrix of intrinsicparameters.
I (cx , cy ) is a principal point (that is usually at the imagecenter).
I fx , fy are the focal lengths expressed in pixel-related units.
I The joint rotation-translation matrix [R|t] is called a matrix ofextrinsic parameters.
I A=?, R=?, t=?
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
I http://grauonline.de/wordpress/?p=5
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
I http://www.jesusllor.es/?p=37
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
I http://www.jesusllor.es/?p=37
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:
import glob
import cv
PATH_ORIGIN = "../../images/chessboard/test/*.jpg"
list_files = glob.glob(PATH_ORIGIN)
# Create a structure for a gray image
rgb_image = cv.LoadImage(list_files[0], cv.CV_LOAD_IMAGE_COLOR)
gray_image = cv.CreateImage(cv.GetSize(rgb_image), cv.IPL_DEPTH_8U, 1)
# Window to show images
cv.NamedWindow("Show image", 1)
cv.NamedWindow("Show corners", 1)
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:
# Board size
chessboard_dim = (7,7) #width, height
# Get the image data
n_boards = len(list_files) # Number of boards
print "Number of boards", n_boards
board_w = chessboard_dim[0]
board_h = chessboard_dim[1]
board_n = board_w * board_h # Datos por tablero
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:
# Save the image information and objects in the world
image_points = cv.CreateMat(n_boards*board_n, 2, cv.CV_32FC1)
object_points = cv.CreateMat(n_boards*board_n, 3, cv.CV_32FC1)
points_counts = cv.CreateMat(n_boards, 1, cv.CV_32SC1)
intrinsic_matrix = cv.CreateMat(3, 3, cv.CV_32FC1)
distortion_coeffs = cv.CreateMat(4, 1, cv.CV_32FC1)
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:
successes = 0
total_corners = 0
# Read images of a directory
for file_image in list_files:
print "Image file: ", file_image
# Load image
rgb_image = cv.LoadImage(file_image, cv.CV_LOAD_IMAGE_COLOR)
cv.ShowImage("Mostrar imagen", rgb_image)
# Corners detected (It works best if the image is in color)
found_all, corners =
cv.FindChessboardCorners(rgb_image, chessboard_dim,
cv.CV_CALIB_CB_ADAPTIVE_THRESH|cv.CV_CALIB_CB_NORMALIZE_IMAGE)
# Improving detection of corners
cv.CvtColor(rgb_image, gray_image, cv.CV_RGB2GRAY)
corners =
cv.FindCornerSubPix(gray_image, corners, (5,5), (-1,-1),
(cv.CV_TERMCRIT_EPS+cv.CV_TERMCRIT_ITER, 30, 0.1))
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:# Draw corners
cv.DrawChessboardCorners(rgb_image, chessboard_dim, corners, found_all)
cv.ShowImage("Mostrar esquinas", rgb_image)
# If we got a good board, add it to our data
counter_count = len(corners)
print "Counter count: ", counter_count
if (counter_count == board_n):
step = successes * board_n
print "step: ", step
i = step
j = 0
while j < board_n:
# Agregar los datos a las matrices
image_points[i, 0] = corners[j][0]
image_points[i, 1] = corners[j][1]
object_points[i, 0] = j//board_w
object_points[i, 1] = j%board_w
object_points[i, 2] = 0.0
j += 1
i += 1
points_counts[successes, 0] = board_n
total_corners += board_n
successes += 1
else:
break
cv.WaitKey()
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:
# CALIBRATE THE CAMERA!
cv.SetZero(intrinsic_matrix)
cv.SetZero(distortion_coeffs)
intrinsic_matrix[0, 0] = 1.0
intrinsic_matrix[1, 1] = 1.0
print "n_board", n_boards
print "total_corners", total_corners
rvects = cv.CreateMat(n_boards, 3, cv.CV_32FC1)
tvects = cv.CreateMat(n_boards, 3, cv.CV_32FC1)
cv.CalibrateCamera2(object_points,
image_points,
points_counts,
cv.GetSize(gray_image),
intrinsic_matrix,
distortion_coeffs,
rvects,
tvects,
0)
Luis Baumela, Juan Bekios-Calfa Camera Calibration
OpenCV and firewire camera
Camara calibration
Code:
print "Intrinsic matrix"
for i in xrange(3):
print [intrinsic_matrix[i,j] for j in xrange(3)]
print "Vector rotation"
for i in xrange(n_boards):
print rvects[i,0], rvects[i,1], rvects[i,2]
Luis Baumela, Juan Bekios-Calfa Camera Calibration