2017-05-18 79 views
4

Found solution at https://github.com/opencv/opencv/issues/4943OpenCV的錯誤:斷言失敗在undistort.cpp在行293

OpenCV的錯誤:

Assertion failed (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 cvUndistortPoints, file /home/javvaji/opencv-3.2.0/modules/imgproc/src/undistort.cpp, line 293

retval, rvec, tvec = cv2.solvePnP(cam.object_points, cam.image_points, cam.camera_matrix, cam.dist_coefficients, None, None, False, cv2.SOLVEPNP_P3P) 

我使用solvePnP功能與標誌​​SOLVEPNP_P3P。它給出斷言錯誤。相同的solvePnP代碼與SOLVEPNP_ITERATIVE標誌正常工作。使用P3P標誌,它會在內部調用發生錯誤的undistortPoints函數。

solvePnP碼參考:https://github.com/opencv/opencv/blob ...

如何解決這個問題?

回答

1

不完整文檔 - solvePnP在python(問題是在OpenCV中GitHub庫開放問題) https://github.com/opencv/opencv/issues/4943

  • 因爲solvePnP需要連續的陣列(通過使用斷言強迫

    numpy的陣列片將不會作爲輸入工作cv :: Mat :: checkVector()模塊/ calib3d/src/solvepnp.cpp版本2.4.9附近的第55行)

  • P3P算法要求圖像點位於形狀數組(N,1, 2)由於它調用了cv :: undistortPoints(在modules/calib3d/src/solvepnp.cpp第75行左右在2.4.9)這需要2通道信息。因此,給定一些數據D = np.array(...),其中D.shape =(N,M),爲了將它的子集用作例如imagePoints,必須有效地複製它轉換成新的陣列:imagePoints = np.ascontiguousarray(D [:,:2])。reshape((N,1,2))

相關問題