OpenCV错误:第293行的undistort.cpp中的断言失败

时间:2017-05-18 08:22:12

标签: python opencv numpy opencv3.0 opencv-solvepnp

  

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 ||   cvUndistortPoints中的CV_MAT_TYPE(_dst-> type)== CV_64FC2))   /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_ITERATIVE标志,相同的solvePnP代码可以正常工作。使用P3P标志,它在内部调用undistortPoints函数,该函数给出错误。

solvePnP code ref:https://github.com/opencv/opencv/blob ...

如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

不完整的文档 - python中的solvePnP(问题是opencv github repo中的开放问题)  https://github.com/opencv/opencv/issues/4943

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

  • P3P算法要求图像点处于形状(N,1,2)的数组中,因为它调用了cv :: undistortPoints(模块的第75行/ calib3d / src / solvepnp.cpp版本) 2.4.9)需要双通道信息。

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