这节教程的目标是学习怎样通过一系列棋盘照片进行摄像机标定.
测试数据: 使用在你 data 或者 chess 文件夹下的照片.
现在, 让我们写一点代码来检测在一幅图像中的棋盘格,并获取他到摄像机的距离. 你可以使用同样的方法来针对任何已知三维几何结构的物体,这个物体可以在一幅图像中被检测到.
测试数据: 使用来自你的数据文件夹下的 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<Point3f> 变量,这个数组可以存放在任何坐标系统下的棋盘格三维坐标. 为简便起见, 让我们选择一个棋盘一角在原点并且棋盘在平面 z = 0 上的系统.
从 XML/YAML 文件中读取摄像机参数:
FileStorage fs(filename, FileStorage::READ);
Mat intrinsics, distortion;
fs["camera_matrix"] >> intrinsics;
fs["distortion_coefficients"] >> distortion;
现在我们通过执行函数 solvePnP 可以找到棋盘姿势了:
vector<Point3f> boardPoints;
// 填充数组
...
solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix,
distCoeffs, rvec, tvec, false);
计算重投影误差,参照例子 calibration (请看 opencv/samples/cpp/calibration.cpp, 函数 computeReprojectionErrors).
问题: 怎样计算摄像机原点到任一角点的距离呢?
guoming0000@ OpenCV中文网站 <guoming0000@sina.com>