OpenCV Error: Assertion failed in undistort.cpp at line 293

OpenCV Error: Assertion failed in undistort.cpp at line 293

Found solution at https://github.com/opencv/opencv/issues/4943

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_P3P 的 solvePnP 函数。它给出断言错误。相同的 solvePnP 代码可以与 SOLVEPNP_ITERATIVE 标志配合使用。使用 P3P 标志,它在内部调用 undistortPoints 函数,该函数给出错误。

solvePnP code ref

如何解决?

不完整的文档 -- python 中的 solvePnP (问题是已知的,opencv github 存储库中的 issue is open

  • Numpy 数组切片不能作为输入,因为 solvePnP 需要连续数组(由使用 cv::Mat::checkVector() 的断言在 line 55 of modules/calib3d/src/solvepnp.cpp 版本 2.4.9 附近强制执行)

  • P3P 算法要求图像点位于形状数组 (N,1,2) 中,因为它正在调用 cv::undistortPoints(大约 line 75 of modules/calib3d/src/solvepnp.cpp 版本 2.4.9)这需要2通道信息。

  • 因此,给定一些数据 D = np.array(...) 其中 D.shape = (N,M),为了使用它的一个子集,例如,imagePoints,必须有效地将其复制到一个新数组中:imagePoints = np.ascontiguousarray(D[:,:2]).reshape((N,1,2))