图像处理|opencv使用相机标定——实战篇(附代码与可执行程序并解决程序崩溃问题)

准备 1.运行环境:VS2010与VS2017均可,opencv2.9与opencv2.9以上均可。
2.拍十五张标定板图片
图像处理|opencv使用相机标定——实战篇(附代码与可执行程序并解决程序崩溃问题)
文章图片

3.放到calibdata.txt目录下
图像处理|opencv使用相机标定——实战篇(附代码与可执行程序并解决程序崩溃问题)
文章图片

4.代码

#include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/highgui/highgui.hpp" #include #include using namespace cv; using namespace std; void main() { ifstream fin("calibdata.txt"); /* 标定所用图像文件的路径 */ ofstream fout("caliberation_result.txt"); /* 保存标定结果的文件 */ //读取每一幅图像,从中提取出角点,然后对角点进行亚像素精确化 cout<<"开始提取角点………………"; int image_count=0; /* 图像数量 */ Size image_size; /* 图像的尺寸 */ Size board_size = Size(6,8); /* 标定板上每行、列的角点数 */ vector image_points_buf; /* 缓存每幅图像上检测到的角点 */ vector image_points_seq; /* 保存检测到的所有角点 */ string filename; int count= -1 ; //用于存储角点个数。 while (getline(fin,filename)) { image_count++; // 用于观察检验输出 cout<<"image_count = "<count = "< 第 "< : "<"<"< object_points; /* 保存标定板上角点的三维坐标 */ /*内外参数*/ Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0)); /* 摄像机内参数矩阵 */ vector point_counts; // 每幅图像中角点的数量 Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0)); /* 摄像机的5个畸变系数:k1,k2,p1,p2,k3 */ vector tvecsMat; /* 每幅图像的旋转向量 */ vector rvecsMat; /* 每幅图像的平移向量 */ /* 初始化标定板上角点的三维坐标 */ int i,j,t; for (t=0; t(0,j) = Vec2f(image_points2[j].x, image_points2[j].y); tempImagePointMat.at(0,j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y); } err = norm(image_points2Mat, tempImagePointMat, NORM_L2); total_err += err/=point_counts[i]; std::cout<<"第"<>imageFileName; filePath+=imageFileName; filePath+=".jpg"; Mat imageSource = imread(filePath); Mat newimage = imageSource.clone(); //另一种不需要转换矩阵的方式 //undistort(imageSource,newimage,cameraMatrix,distCoeffs); remap(imageSource,newimage,mapx, mapy, INTER_LINEAR); imshow("原始图像",imageSource); imshow("矫正后图像",newimage); waitKey(); StrStm.clear(); filePath.clear(); StrStm<>imageFileName; imageFileName += "_d.jpg"; imwrite(imageFileName,newimage); } std::cout<<"保存结束"<

划重点 【图像处理|opencv使用相机标定——实战篇(附代码与可执行程序并解决程序崩溃问题)】右键工程文件的属性,找到配置属性,找到常规,找到MFC的使用,将使用标准Windows库改为在静态库中使用MFC。
程序运行结果 图像处理|opencv使用相机标定——实战篇(附代码与可执行程序并解决程序崩溃问题)
文章图片

图像处理|opencv使用相机标定——实战篇(附代码与可执行程序并解决程序崩溃问题)
文章图片

点此下载项目工程文件(附标定图片与可运行程序)

    推荐阅读