OpenCV 错误:


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 需要连续数组(由 line 55 of modules/calib3d/src/solvepnp.cpp 版本 2.4.9 周围的 cv::Mat::checkVector() 断言强制执行)
  • P3P 算法要求图像点为形状数组 (N,1,2),因为它调用需要 2 channel 信息的 cv::undistortPoints(大约 line 75 of modules/calib3d/src/solvepnp.cpp 版本 2.4.9)。
  • 因此,给定一些数据 D = np.array(...) 其中 D.shape = (N,M),为了使用它的一个子集,例如 imagePoints,必须有效地将它复制到一个新数组中: imagePoints = np.ascontiguousarray(D[:,:2]).reshape((N,1,2))
  • 关于python - 第 293 行的 OpenCV 错误 : Assertion failed in undistort. cpp,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44042323/

    10-12 17:08