如之前章节内容所述,相机内参标定的流程包括1)采集一些包含棋盘格的相机图像,2)检测棋盘格角点,3)标定计算相机内参与畸变系数,4)验证标定精度与效果。本章我们将开始具体的编程开发,首先完成一些功能性函数的实现。
注:相关代码在Windows平台运行。
这里可以使用电脑自带摄像头进行标定,使用OpenCV的VideoCapture接口可打开摄像头获取图像数据。我们编写一个函数,其功能为打开制定id的摄像头(系统摄像头默认为0)并以指定帧间隔保存图像到某个文件夹下面,具体实现如下。
void SaveCameraImage(int camera_id, int save_frame_interval, char* save_img_path)
{
// 1.创建图像路径文件夹,注意save_img_path指定的路径的上一层路径所在文件夹必须存在
MyRmDir(save_img_path);
_mkdir(save_img_path);
// 2.打开指定id的摄像头,并设置图像分辨率为摄像头支持的最大分辨率
cv::VideoCapture cap;
cap.open(camera_id);
if (!cap.isOpened())
{
printf("Error: open camera %d failed\n", camera_id);
return;
}
cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
// 3.按照指定帧率间隔保存图