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.
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).
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With