2012-06-13 6 views
5

Tengo problemas para formatear la lista x, y de puntos para pasar a undistortPoints (opencv 2.4.1).¿Cómo formatear puntos xy para undistortPoints con la aplicación python cv2?

El mensaje de error es específico de C++ y se queja de que la matriz de puntos no es del tipo CV_32FC2. ¿No debería ser capaz de pasar una matriz Nx2 numpy?

import cv2 

camera_matrix = array(mat('1.3e+03, 0., 6.0e+02; 0., 1.3e+03, 4.8e+02; 0., 0., 1.'), dtype=float32) 
dist_coeffs = array(mat('-2.4-01, 9.5e-02, -4.0e-04, 8.9e-05, 0.'), dtype=float32) 

test = zeros((10,2), dtype=float32) 

print test.shape, type(test) 

xy_undistorted = cv2.undistortPoints(test, camera_matrix, dist_coeffs) 

resultados en:

opencv/modules/imgproc/src/undistort.cpp:279: error: (-215) CV_IS_MAT(_src) && CV_IS_MAT(_dst) && (_src->rows == 1 || _src->cols == 1) && (_dst->rows == 1 || _dst->cols == 1) && _src->cols + _src->rows - 1 == _dst->rows + _dst->cols - 1 && (CV_MAT_TYPE(_src->type) == CV_32FC2 || CV_MAT_TYPE(_src->type) == CV_64FC2) && (CV_MAT_TYPE(_dst->type) == CV_32FC2 || CV_MAT_TYPE(_dst->type) == CV_64FC2) in function cvUndistortPoints 

En muestras/python2/video.py hay uso de projectPoints que tiene una matriz y forma de nuevo que (-1,3), resultando en una matriz Nx3 para que función, parece que el mismo formato debería funcionar aquí.

Respuesta

7

No sé mucho sobre la calibración de la cámara. Pero al ver su código y el error, he cambiado de la siguiente manera:

import cv2 
import numpy as np 
camera_matrix = np.array([[1.3e+03, 0., 6.0e+02], [0., 1.3e+03, 4.8e+02], [0., 0., 1.]], dtype=np.float32) 
dist_coeffs = np.array([-2.4-01, 9.5e-02, -4.0e-04, 8.9e-05, 0.], dtype=np.float32) 

test = np.zeros((10,1,2), dtype=np.float32) 
xy_undistorted = cv2.undistortPoints(test, camera_matrix, dist_coeffs) 

print xy_undistorted 

a continuación es el resultado que obtuve, comprobar si es correcta:

[[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]] 

[[ 0.0187303 0.01477836]]] 

¿Cuál es el problema:

El error dice que la fuente debe estar teniendo EITHER one row OR one column. Y debería ser de CV_32FC2 o CV_64FC2, significa dos canales y coma flotante. Así que haga su configuración de forma (10,1,2) or (1,10,2). Ambos métodos funcionan y dan el mismo resultado (lo comprobé yo mismo). El único problema es que no sé si es correcto, así que compruébalo tú mismo.

+0

Mi salida (con datos reales en lugar de ceros) parece razonable con una nueva configuración (-1,1,2) - gracias por la percepción de que una tercera dimensión de matriz numpy se trata como canales. No estoy seguro de si eso es obvio o está documentado en alguna parte, y parece inconsistente con el ejemplo de ProjectPoints. –

Cuestiones relacionadas