2012-06-13 5 views
5

Mam problem z formatowaniem x, y listy punktów do przekazania do undistortPoints (opencv 2.4.1).Jak sformatować punkty xy dla undistortPoints za pomocą apk pythona cv2?

Komunikat o błędzie jest specyficzny dla C++ i narzeka na tablicę punktów, które nie są typu CV_32FC2. Nie powinienem być w stanie przekazać tablicy Nx2?

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) 

skutkuje:

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 

w próbkach/python2/video.py jest wykorzystanie projectPoints która odbywa tablicy i przekształca go (1,3), co daje, że dla tablicy NX3 funkcja, wygląda na to, że powinien działać ten sam format.

Odpowiedz

7

Nie wiem zbyt wiele na temat kalibracji kamery. Ale widząc kodu i błędów, zmieniłem go w następujący sposób:

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 

Poniżej jest wynikiem mam, sprawdź, czy jest poprawne:

[[[ 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]]] 

czym polega problem:

Błąd jest następujący: źródło powinno mieć wartość EITHER one row OR one column. I powinno to być CV_32FC2 lub CV_64FC2, czyli dwa kanały i zmiennoprzecinkowy. Stwórz swój src o kształcie (10,1,2) or (1,10,2). Obie metody działają i dają ten sam rezultat (sam to sprawdziłem). Jedynym problemem jest to, że nie wiem, czy to jest poprawne, więc sprawdź to sam.

+0

Moje dane wyjściowe (z prawdziwymi danymi zamiast zera) wyglądają rozsądnie z przekształceniem (-1,1,2) - dzięki za wgląd, że trzeci numrem tablicy jest traktowany jak kanał. Nie jestem pewien, czy jest to oczywiste, czy udokumentowane w dowolnym miejscu i wydaje się niezgodne z przykładem projectPoints. –

Powiązane problemy