2012-06-13 19 views
5

Tôi đang gặp sự cố khi định dạng x, y danh sách các điểm để chuyển sang undistortPoints (opencv 2.4.1).Làm thế nào để định dạng xy điểm cho undistortPoints với python cv2 api?

Thông báo lỗi là C++ cụ thể và than phiền về mảng các điểm không thuộc loại CV_32FC2. Không nên tôi có thể vượt qua trong một mảng 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) 

kết quả trong:

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 

Trong mẫu/python2/video.py có sử dụng projectPoints mà phải mất một mảng và reshapes nó (-1,3) dẫn đến một mảng NX3 cho rằng chức năng, có vẻ như cùng định dạng sẽ hoạt động ở đây.

Trả lời

7

Tôi không biết nhiều về hiệu chuẩn máy ảnh. Nhưng nhìn thấy mã của bạn và các lỗi, tôi đã thay đổi nó như sau:

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 

Dưới đây là kết quả tôi nhận được, Kiểm tra nếu nó là đúng:

:

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

vấn đề là gì

Lỗi nói, nguồn phải có EITHER one row OR one column. Và nó phải là của CV_32FC2 hoặc CV_64FC2, có nghĩa là hai kênh và dấu phẩy động. Vì vậy, làm cho src của bạn về hình dạng (10,1,2) or (1,10,2). Cả hai phương pháp làm việc và cho kết quả tương tự (tôi đã tự kiểm tra). Chỉ có vấn đề là, tôi không biết nếu nó là chính xác, vì vậy hãy kiểm tra nó cho mình.

+0

Kết quả đầu ra của tôi (với dữ liệu thực thay vì số không) trông hợp lý với định dạng lại (-1,1,2) - cảm ơn thông tin chi tiết về thứ nguyên mảng thứ ba được coi là kênh. Tôi không chắc chắn nếu đó là rõ ràng hoặc tài liệu bất cứ nơi nào, và có vẻ như không phù hợp với ví dụ projectPoints. –

Các vấn đề liên quan