4

在https://github.com/opencv/opencv/issues/4943找到解决方案

OpenCV 错误:

断言失败 (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)) 在 cvUndistortPoints,文件 /home/javvaji/opencv-3.2.0/modules/imgproc/src/undistort.cpp ,第 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 函数,该函数给出错误。

解决即插即用代码参考

如何解决这个问题?

4

1 回答 1

7

不完整的文档——python中的solvePnP(已知问题,opencv github存储库中存在问题)

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

  • P3P 算法要求图像点位于形状数组 (N,1,2) 中,因为它调用 cv::undistortPoints (在modules/calib3d/src/solvepnp.cpp版本 2.4.9 的第 75 行附近),这需要 2-渠道信息。

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

于 2017-05-18T11:13:09.090 回答