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

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

本文关键字:CV MAT IS rvec imagePoints 失败 objectPoints Assert 断言      更新时间:2023-10-16

我已经校准了一台相机并获得了0.17的重投影错误,文件保存为camera.yml。然后,我将这个文件导入到我的 aruco 检测算法中,当我运行这个算法时,一切都很好,直到检测到 aruco 标记,但是,检测到 aruco 标记的那一刻,代码会抛出以下错误并停止运行。

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 检测算法时导入该文件时,它运行没有任何错误。

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

  • camera.yml: https://www.codepile.net/pile/mO4DGDOR

  • sample.yml: https://www.codepile.net/pile/5qBKoNP6

我正在使用OpenCV 3.4.2。

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