在 https://github.com/opencv/opencv/issues/4943 找到解决方案
OpenCV 错误:
断言失败 (CV_IS_MAT(_src( &&CV_IS_MAT(_dst( &&(_src->行 == 1 ||_src->cols == 1( && (_dst->rows == 1 || _dst->cols == 1( && _src->列 + _src->行 - 1 == _dst->行 + _dst->列 - 1 && (CV_MAT_TYPE(_src->类型( == CV_32FC2 ||CV_MAT_TYPE(_src->型( == CV_64FC2( && (CV_MAT_TYPE(_dst->type( == CV_32FC2 || CV_MAT_TYPE(_dst->类型( == CV_64FC2(( in cvUndistortPoints, file /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标志,它在内部调用未扭曲点函数,该函数会给出错误。
solvePnP code ref
如何解决这个问题?
不完整的文档 -- python 中的 solvePnP(问题已知,opencv github存储库中未解决问题(
-
Numpy 数组切片不能用作输入,因为 solvePnP 需要连续数组(由 modules/calib3d/src/solvepnp.cpp版本 2.4.9 的第 55 行周围的断言强制执行(
-
P3P 算法要求图像点的形状为 (N,1,2( 数组,因为它调用 cv::undistortPoints(模块/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((