如何通过索引访问cv::calibrateCamera返回的矩阵值?调用后访问失败
解决OpenCV calibrateCamera后访问cameraMatrix元素异常的问题
这问题我之前也踩过坑!核心原因是**cv::calibrateCamera会偷偷修改你传入的cameraMatrix的数据类型**——哪怕你一开始初始化的是CV_32F单精度浮点型,函数内部为了保证标定计算的精度,会自动把它转为CV_64F双精度浮点型。这时候你再用at<float>(2,2)去访问,就会因为类型不匹配触发内存访问异常。
你自己写的测试代码没问题,是因为你构造的test矩阵明确是CV_32F,类型完全匹配自然能正常访问。
下面给你几个可行的解决办法:
直接用双精度访问(最推荐)
既然函数输出的是CV_64F,那就直接用at<double>来访问元素:std::cout << "Value at [2,2]: " << cameraMatrix.at<double>(2,2) << std::endl;转换为单精度后再访问
如果你的场景必须用单精度,可以把输出的矩阵转换类型后再操作:cv::Mat cameraMatrix32F; cameraMatrix.convertTo(cameraMatrix32F, CV_32F); std::cout << "Value at [2,2]: " << cameraMatrix32F.at<float>(2,2) << std::endl;初始化为双精度矩阵
从源头避免类型变化,一开始就把cameraMatrix定义为CV_64F:cv::Mat cameraMatrix = cv::Mat(3, 3, CV_64F); cv::Mat distCoeffs = cv::Mat(1, 5, CV_64F); // 后续调用calibrateCamera后,直接用at<double>访问即可
另外,你可以加一行代码验证矩阵类型,这样能快速定位问题:
// 打印矩阵类型,CV_32F对应5,CV_64F对应6 std::cout << "cameraMatrix type: " << cameraMatrix.type() << std::endl;
内容的提问来源于stack exchange,提问作者Fujie
相关产品推荐
相关产品推荐

