2012-06-13 115 views
5

我在格式化x,y點傳遞給undistortPoints(opencv 2.4.1)的列表時遇到了問題。如何使用python cv2 api格式化xist點for undistortPoints?

該錯誤消息是C++特定的,並且抱怨點數不是CV_32FC2類型的數組。我不應該能夠通過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) 

結果:

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 

在樣本/ python2/video.py有導致一個NX3陣列對於projectPoints的使用,其帶有一個數組和重塑它(-1,3)功能,看起來像相同的格式應該在這裏工作。

回答

7

我對相機校準瞭解不多。但看到你的代碼和錯誤,我改變了它如下:

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 

下面是我得到的結果,檢查是否是正確的:

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

是什麼問題:

錯誤說,源應該有EITHER one row OR one column。它應該是CV_32FC2或CV_64FC2,意思是兩個通道和浮點。所以讓你的src的形狀(10,1,2) or (1,10,2)。這兩種方法的工作,並給出相同的結果(我自己檢查)。唯一的問題是,我不知道它是否正確,所以請自己檢查一下。

+0

我的輸出(真實數據而不是零)看起來合理,重塑(-1,1,2) - 感謝第三個numpy數組維度被視爲通道的洞察力。我不確定這是明顯的還是記錄在任何地方,似乎與projectPoints示例不一致。 –