.. _CameraCalibrationSquareChessBoardTutorial: 使用棋盘格来进行摄像机标定 ***************************************** .. highlight:: cpp 这节教程的目标是学习怎样通过一系列棋盘照片进行摄像机标定. *测试数据*: 使用在你 data 或者 chess 文件夹下的照片. #. 编译带有例子的OpenCV,在cmake的配置中把 ``BUILD_EXAMPLES`` 项设置为 ``ON`` . #. 打开 ``bin`` 文件夹并使用 ``imagelist_creator`` 来创建一个包含你的照片列表的 ``XML/YAML`` 文件. #. 然后, 运行 ``calibration`` 例子来获取摄像机参数. 使用方格的大小等于3厘米. 姿势估计 =============== 现在, 让我们写一点代码来检测在一幅图像中的棋盘格,并获取他到摄像机的距离. 你可以使用同样的方法来针对任何已知三维几何结构的物体,这个物体可以在一幅图像中被检测到. *测试数据*: 使用来自你的数据文件夹下的 chess_test*.jpg 图片. #. 创建一个空的控制台项目. 载入一幅图片: :: Mat img = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE); #. 使用 findChessboard 函数来检测图片中的棋盘. :: bool found = findChessboardCorners( img, boardSize, ptvec, CV_CALIB_CB_ADAPTIVE_THRESH ); #. 现在, 定义一个容器 ``vector`` 变量,这个数组可以存放在任何坐标系统下的棋盘格三维坐标. 为简便起见, 让我们选择一个棋盘一角在原点并且棋盘在平面 *z = 0* 上的系统. #. 从 XML/YAML 文件中读取摄像机参数: :: FileStorage fs(filename, FileStorage::READ); Mat intrinsics, distortion; fs["camera_matrix"] >> intrinsics; fs["distortion_coefficients"] >> distortion; #. 现在我们通过执行函数 ``solvePnP`` 可以找到棋盘姿势了: :: vector boardPoints; // 填充数组 ... solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix, distCoeffs, rvec, tvec, false); #. 计算重投影误差,参照例子 ``calibration`` (请看 ``opencv/samples/cpp/calibration.cpp``, 函数 ``computeReprojectionErrors``). 问题: 怎样计算摄像机原点到任一角点的距离呢? 翻译者 ================= guoming0000@ `OpenCV中文网站 `_