OPENCV: Error de reproyección de Calibratecamera 2 y uno computado personalizado no de acuerdo

Tengo un script en python que usa el método calibratecamera2 para calibrar una cámara desde unas pocas vistas de un tablero de ajedrez. Después de una calibración exitosa, voy después de todos los puntos originales y hago algunos gráficos y calculo nuevamente el error de re-proyección. Mi sorpresa es que el error de reproyección calculado por opencv y mío es un poco diferente. Me pareció extraño. ¿Lo estoy calculando de manera incorrecta?

obj_points = []# 3d point in real world space. List of arrays img_points = []# 2d points in image plane. List of arrays ... ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, (w, h), camera_matrix, dist_coeffs, rvecs, tvecs, calib_flags +cv2.CALIB_USE_INTRINSIC_GUESS, criteria) print "Final reprojection error opencv: ", ret #Compute mean of reprojection error tot_mean_error=0 mean_error_image = 0 for i in xrange(len(obj_points)): reprojected_points, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], camera_matrix, dist_coeffs) reprojected_points=reprojected_points.reshape(-1,2) mean_error_image=np.sum(np.sum(np.abs(img_points[i]-reprojected_points)**2,axis=-1)**(1./2))/np.alen(reprojected_points) tot_mean_error +=mean_error_image mean_error=tot_mean_error/len(obj_points) print "Mean reprojection error: ", mean_error 

Error de reproyección final opencv: 0.571030279037

Error medio de reproyección: 0.438696960449

Lo estaba calculando mal / diferente Estaba usando este tipo de fórmula:

fórmula

Pero opencv usa este:

fomrula_opencv

Entonces, si a alguien le interesa, el código se ve ahora como:

 #Compute mean of reprojection error tot_error=0 total_points=0 for i in xrange(len(obj_points)): reprojected_points, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], camera_matrix, dist_coeffs) reprojected_points=reprojected_points.reshape(-1,2) tot_error+=np.sum(np.abs(img_points[i]-reprojected_points)**2) total_points+=len(obj_points[i]) mean_error=np.sqrt(tot_error/total_points) print "Mean reprojection error: ", mean_error 

Error de reproyección final opencv: 0.571030279037

Error medio de reproyección: 0.571030718956