1

All, I have a python script that uses OpenCV to calibrate a camera. It now works with much help from stackoverflow help. But, I'm having problems with the distortion constants. I can not seem to control the number of constants fit. I want only 4 distoriton constants, not 5. In the documentation it states "That is, if the vector contains four elements, it means that K3=0", that is what I want. So I initiate dist_const = np.zeros(4), pass it to cv2.calibrateCamera, but the returned dist_const has 5 constants returned. I've also tried the flag CV_CALIB_FIX_K3, but keep getting a 'an iteger must be asigned' error. Has anyone seen this behavior before, any help would be appreciated greatly.

import cv2 
from cv2 import cv 
import numpy as np

obj_points = [[-9.7,3.0,4.5],[-11.1,0.5,3.1],[-8.5,0.9,2.4],[-5.8,4.4,2.7],[-4.8,1.5,0.2],[-6.7,-1.6,-0.4],[-8.7,-3.3,-0.6],[-4.3,-1.2,-2.4],[-12.4,-2.3,0.9],[-14.1,-3.8,-0.6],[-18.9,2.9,2.9],[-14.6,2.3,4.6],[-16.0,0.8,3.0],[-18.9,-0.1,0.3],[-16.3,-1.7,0.5],[-18.6,-2.7,-2.2]]

img_points = [[993.0,623.0],[942.0,705.0],[1023.0,720.0],[1116.0,645.0],[1136.0,764.0],[1071.0,847.0],[1003.0,885.0],[1142.0,887.0],[886.0,816.0],[827.0,883.0],[710.0,636.0],[837.0,621.0],[789.0,688.0],[699.0,759.0],[768.0,800.0],[697.0,873.0]]

obj_points = np.array(obj_points,'float32')
img_points = np.array(img_points,'float32')

w = 1680
h = 1050
size = (w,h)

camera_matrix = np.zeros((3,3),'float32')
camera_matrix[0,0]= 2200.0
camera_matrix[1,1]= 2200.0
camera_matrix[2,2]=1.0

camera_matrix[0,2]=750.0 
camera_matrix[1,2]=750.0

dist_coefs = np.zeros(4,'float32')

retval,camera_matrix,dist_coefs,rvecs,tvecs = cv2.calibrateCamera([obj_points],[img_points],size,camera_matrix,dist_coefs,flags=cv.CV_CALIB_USE_INTRINSIC_GUESS)

print camera_matrix
print dist_coefs

link to my other question, has results for dist_coefs, from the caltech matlab code I'm trying to replace with python/opencv.

john

hokiebird
  • 280
  • 1
  • 5
  • 15

3 Answers3

6

Change your calibrateCamera call to:

retval,camera_matrix,dist_coefs,rvecs,tvecs = cv2.calibrateCamera([obj_points],[img_points],size,camera_matrix,dist_coefs,flags=cv2.CALIB_USE_INTRINSIC_GUESS + cv2.CALIB_FIX_K3)

You don't want to me mixing the cv2 and cv namespaces like you did in your example.

Jed
  • 76
  • 1
0

I see what you mean. Maybe because you're only using a single image for the calibration.

uhno
  • 1
  • 1
    it seems there is no good answer for this one. I posted the same question to the opencv list on yahoo, with no takers. this is why the majority of CV research is done with Matlab. It takes so much effort to replicate what I already have running in Matlab. – hokiebird Apr 18 '12 at 07:24
0

I had the same problem and the solution I found was:

import cv2
from cv2 import cv


... flags = cv2.cv.CALIB_USE_INTRINSIC_GUESS + ...
Bob
  • 5,510
  • 9
  • 48
  • 80