断言失败 CV_Assert( CV_IS_MAT(objectPoints) && CV_IS_MAT(imagePoints) && CV_IS_MAT(A) && CV_IS_MAT(rvec) && CV_IS_MAT( tvec) )

Assertion failed CV_Assert( CV_IS_MAT(objectPoints) && CV_IS_MAT(imagePoints) && CV_IS_MAT(A) && CV_IS_MAT(rvec) && CV_IS_MAT(tvec) )

我校准了一个相机,重投影误差为0.17,文件保存为camera.yml。然后,我将这个文件导入到我的 aruco 检测算法中,当我 运行 这个算法时,一切都开始正常,直到检测到 aruco 标记,但是,当检测到 aruco 标记时,代码抛出以下错误并且停止 运行ning.

cv exception: OpenCV(3.4.2) error: (-215:Assertion failed) (((objectPoints) != __null && (((const CvMat*)(objectPoints))->type & 0xFFFF0000) == 0x42420000 && ((const CvMat*)(objectPoints))->cols > 0 && ((const CvMat*)(objectPoints))->rows > 0) && ((const CvMat*)(objectPoints))->data.ptr != __null) && (((imagePoints) != __null && (((const CvMat*)(imagePoints))->type & 0xFFFF0000) == 0x42420000 && ((const CvMat*)(imagePoints))->cols > 0 && ((const CvMat*)(imagePoints))->rows > 0) && ((const CvMat*)(imagePoints))->data.ptr != __null) && (((A) != __null && (((const CvMat*)(A))->type & 0xFFFF0000) == 0x42420000 && ((const CvMat*)(A))->cols > 0 && ((const CvMat*)(A))->rows > 0) && ((const CvMat*)(A))->data.ptr != __null) && (((rvec) != __null && (((const CvMat*)(rvec))->type & 0xFFFF0000) == 0x42420000 && ((const CvMat*)(rvec))->cols > 0 && ((const CvMat*)(rvec))->rows > 0) && ((const CvMat*)(rvec))->data.ptr != __null) && (((tvec) != __null && (((const CvMat*)(tvec))->type & 0xFFFF0000) == 0x42420000 && ((const CvMat*)(tvec))->cols > 0 && ((const CvMat*)(tvec))->rows > 0) && ((const CvMat*)(tvec))->data.ptr != __null) in function 'cvFindExtrinsicCameraParams2'

错误是由

引起的

CV_Assert( CV_IS_MAT(objectPoints) && CV_IS_MAT(imagePoints) && CV_IS_MAT(A) && CV_IS_MAT(rvec) && CV_IS_MAT(tvec) );

可以在 opencv/modules/calib3d/src/calibration.cpp 的第 996 行 (https://github.com/opencv/opencv/blob/3.4/modules/calib3d/src/calibration.cpp) 中找到。

我知道Rvecs 和TVecs 是在校准文件的帮助下生成的。校准中的某些内容似乎格式不正确。

我有一个属于另一个相机的示例校准文件 (sample.yml)。当我在 运行 使用 aruco 检测算法时导入该文件时,它 运行 没有任何错误。

这些文件的内容(如果您想比较它们)可在此处获得:

我正在使用 OpenCV 3.4.2。

整个问题是两个文件之间的命名约定不一致。我将名称从 sample.yml 复制到 camera.yml,它开始工作了。有时解决方案就是这么简单。