网上有很多关于张正友标定法的介绍和源码,这里我就不过多介绍了,但在众多源码和介绍中我没找到几个关于如何将参数使用在其它图片上的方法(本人也是萌新),后再在其他标定中找到了方法特来记录一下:
我在使用opencv封装的函数进行标定时发现他是通过将参数保存为xml文件,因为是他们封装好的没有仔细看他们的代码,就在想可不可以将这种方式运用到张正有标定法中以来获取同样的效果,之后查阅了很多资料发现通过FileStorage 可以轻松做到,方法如下:
FileStorage fs("ax.xml", FileStorage::WRITE); //用于保存相机内参和畸变系数 为xml文件
fs << "camera_matrix" << cameraMatrix;
fs << "distortion_coefficients" << distCoeffs;
fs.release();
通过这个函数我们可以将参数保存到xml文件中,效果如下:
下面是我测试的代码(跟opencv封装函数所得参数 测试方法一样):
#include <opencv2/opencv.hpp>
#include <opencv2/calib3d/calib3d.hpp>
using namespace std;
using namespace cv;
int main()
{
/// 读取一副图片,不改变图片本身的颜色类型(该读取方式为DOS运行模式)
Mat src = imread("66.jpg");
//imshow("1", src);
//初始化一个图片用于存放校正后的图片
Mat distortion;
//初始化 相机内参 和 畸变系数矩阵
Mat camera_matrix = Mat(3, 3, CV_32FC1);
Mat distortion_coefficients = Mat(1, 5, CV_32FC1);
// 在读取文档内容是一定要和文档里面参数名称一致
//导入文档获取存放的 相机内参和畸变系数矩阵
FileStorage file_storage("out_camera_data.xml", FileStorage::READ);
//将文档中的相机参数取出存放到本地初始化相机参数 camera_matrix中
file_storage["camera_matrix"] >> camera_matrix;
//将文档中的畸变系数矩阵取出存放到本地初始化畸变系数矩阵 distortion_coefficients中
file_storage["distortion_coefficients"] >> distortion_coefficients;
//释放文档
file_storage.release();
//通过相机参数和畸变系数矩阵矫正图片
//第一个参数 传入图片 第二个参数 校正后的图片 第三个参数 输入相机内参 第四个参数 畸变系数矩阵
undistort(src, distortion, camera_matrix, distortion_coefficients);
imshow("undistort", distortion);
imwrite("66_d.jpg", distortion);
waitKey(0);
return 0;
}