c++ - 在 OpenCV CameraCalibration 函数中计算对象点

标签 c++ opencv camera-calibration

我想使用 opencv Cameracalibration 函数 (calibrateCamera()) 来校准我的相机。
根据opencv document , 我的棋盘至少要拍 10 张。
但是当我想计算 objectPoints(这里是棋盘内部点的位置)时,我感到困惑:

如果原点是相机并且棋盘在移动,我很容易理解这个概念的理论基础,但很难计算objectPoints
第二种方法是固定棋盘并移动相机。但在这个解决方案中,我不明白如何在计算 objectPoints 或任何其他方式时应用相机与棋盘的距离对 opencv 相机校准函数说,这种距离和方向的变化。

如果你能帮助我解决我的问题,我将不胜感激。

最佳答案

您提到的第二种方法最受欢迎,因为它非常易于使用。

假设您有以下 (9,6) 棋盘,其中正方形的边长为 a:

opencv calibration chessboard
(来源:opencv.org)

然后,您只需按如下方式定义对象点:

// 3D coordinates of chessboard points
std::vector<cv::Point3f> objectPoints;
for(int y=0; y<6; ++y) {
    for(int x=0; x<9; ++x)
        objectPoints.push_back(cv::Point3f(x*a,y*a,0));
}
// One vector of chessboard points for each chessboard image
std::vector<std::vector<cv::Point3f>> arrayObjectPoints;
for(int n=0; n<number_images; ++n)
    arrayObjectPoints.push_back(objectPoints);

基本上,由于您可以随意选择3D坐标系,因此您可以选择使用棋盘坐标系,这使得对象点非常容易定义。然后,calibrateCamera 函数将负责为每个图像估计一个 R,t(相对于所选坐标系的相对方向和平移),以及一个内在矩阵 K 和畸变系数 D,这些矩阵对所有图像都是通用的图片。

另外,注意对 2D 点使用相同的顺序。

关于c++ - 在 OpenCV CameraCalibration 函数中计算对象点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338728/

相关文章:

c++ - gdb 没有捕捉到 vector 抛出的 std::out_of_range

c++ - 我有一个表示整数的类,我想区分 lbs 和 kg 我该怎么做?

OpenCV:关于 solvePnP 的困惑

camera-calibration - 相机单应性

c++ - Qt5:如何使用QProcess进行批处理

c++ - 不要在Catch2测试用例中合并生成器

c++ - 使用 cvGet2D cvSet2D 函数修改图像像素

c++ - 在录制时流式传输视频文件

python - 如何使用 Python 和 OpenCV 计算像素总和

Android 切换相机闪光灯