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í.
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. –