Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

input arguments of python's cv2.calibrateCamera

I get the following error when I try to calibrate camera using cv2.calibrateCamera:

rms, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(pts3d, pts2d, self.imgsize, None, None)
cv2.error: /home/sarkar/opencv/opencv/modules/calib3d/src/calibration.cpp:2976: error: (-210) objectPoints should contain vector of vectors of points of type Point3f in function collectCalibrationData

I initially had nx3 and nx2 array for pts3d and pts2d. I then tried to reshape pts3d and pts2d in the following form as the function takes vectors of vector point3d (and correspondingly pts2d) as input:

[1 x n x 3] and [1 x n x 2]

[k x n' x 3] and [k x n' x 3], where k is some random value

[1 x n x 1 x 3] and [1 x n x 1 x 2]

nothing works and it always gives the same error.

I saw the code sample code of cameraclibration provided which runs fine, and their input is of [k x n x 3]. I really don't know what is wrong with my implementation. Following is my code to be precise:

   #data contains [n x 5] dim array which is the hstacked arrays of pts3d and pts2d correspondences I obtained elsewhere. 
    pts3d = data[:, 0:3] #first 3 column 
    pts2d = data[:, 3:5] #next 2 column.. I checked the values are coming correctly 
    pts3d = pts3d.reshape(1,-1, 3) #Here, I have experimented by resizing with different values. 
    pts2d = pts2d.reshape(1,-1, 2)

    rms, camera_matrix, dist_coefs, rvecs, tvecs = cv2.calibrateCamera(pts3d, pts2d, self.imgsize, None, None)    

the error happens at the time of the function call. It would be nice to know what can be wrong here.

like image 238
krips89 Avatar asked Mar 31 '15 14:03

krips89


2 Answers

I had the same problem and found the answer for it at this topic: OpenCV 2.3 camera calibration

The main steps are:

pts3d = pts3d.astype('float32')
pts2d = pts2d.astype('float32')

# This can be omitted and can be substituted with None below.
camera_matrix = cv2.initCameraMatrix2D([pts3d],[pts2d]), self.imgsize)  

cv2.calibrateCamera([pts3d], [pts2d], self.imgsize, camera_matrix, None, 
                    flags=cv2.CALIB_USE_INTRINSIC_GUESS)

It was written for OpenCV 2.3, but it works for me even with OpenCV 3.0 (dev branch in git) with Python 3.3.5 (64 bit).

like image 170
Csega Avatar answered Nov 24 '22 20:11

Csega


I'm using OpenCV 3.4 and found that pts3d (shape 1 * n * 3) and pts2d (shape 1 * n * 2) works for me. Just remember to change type (my default type is float64) to float32, as Csega noted.

like image 43
Shidan Avatar answered Nov 24 '22 20:11

Shidan