![]() |
OpenCV 4.12.0
开源计算机视觉
|
前一篇教程: 创建标定图案
下一篇教程: 使用 OpenCV 进行相机标定
| 原始作者 | Victor Eruhimov |
| 兼容性 | OpenCV >= 4.0 |
本教程的目标是学习如何使用一组棋盘图像来标定相机。
测试数据: 使用 data/chess 文件夹中的图像。
现在,让我们编写代码来检测图像中的棋盘并找到它与相机的距离。您可以将此方法应用于任何具有已知 3D 几何体的物体;您可以在图像中检测到它。
测试数据: 使用 data 文件夹中的 chess_test*.jpg 图像。
Mat img = imread(argv[1], IMREAD_GRAYSCALE);
bool found = findChessboardCorners( img, boardSize, ptvec, CALIB_CB_ADAPTIVE_THRESH );
FileStorage fs( filename, FileStorage::READ ); Mat intrinsics, distortion; fs["camera_matrix"] >> intrinsics; fs["distortion_coefficients"] >> distortion;
vector<Point3f> boardPoints;
// fill the array
...
solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix,
distCoeffs, rvec, tvec, false);
问题:你如何计算从相机原点到任何一个角的距离? 答案:在使用 solvePnP 获得相机位姿后,旋转向量 (rvec) 和平移向量 (tvec) 定义了世界(棋盘)坐标和相机坐标系之间的变换。 要计算从相机原点到任何棋盘角的距离,首先将 3D 点从棋盘坐标系变换到相机坐标系(如果尚未完成),然后使用 L2 范数计算其欧几里得距离,例如
// assuming 'point' is the 3D position of a chessboard corner in the camera coordinate system
double distance = norm(point);
这相当于对 3D 点的坐标 (x, y, z) 应用 L2 范数。