立体相机镜面重建(一)镜面标定

无论是单目、双目或者是多屏幕镜面重建,都需要事先对屏幕和相机的相对位置进行标定,求得相机到屏幕之间的相对变换关系。如果求得屏幕和相机之间的变换关系呢?接下来是标定流程。

(一)准备:

1)生成1920*1080像素的标定板

复制代码
// 生成棋盘格图像
void genChessBoardBmp()
{
    const int perBoardPixel = 70;
    const cv::Size boardSize(11, 9);
    const cv::Size resolution(1920,1080);
    {
        int basisHeight = (resolution.height - perBoardPixel * boardSize.height) / 2;
        int basisWidth = (resolution.width - perBoardPixel * boardSize.width) / 2;
        if (basisHeight < 0 || basisWidth < 0)
        {
            //cout << "Resolution doesn't match!" << endl;
        }
        cv::Mat image(1080,1920, CV_8UC1, cv::Scalar::all(255));
        int flag = 0;
        for (int j = 0; j < boardSize.height; j++)
        {
            for (int i = 0; i < boardSize.width; i++)
            {
                flag = (i + j) % 2;
                if (flag == 0)
                {
                    for (int n = j * perBoardPixel; n < (j + 1) * perBoardPixel; n++)
                        for (int m = i * perBoardPixel; m < (i + 1) * perBoardPixel; m++)
                            image.at<uchar>(n + basisHeight, m + basisWidth) = 0;
                }
            }
        }
        //cv::imshow("haha",image);
        std::string strSavePath = std::string("H") + std::to_string(boardSize.width) + "_V" + std::to_string(boardSize.height) + "_" +
            std::to_string(perBoardPixel) + ".bmp";
        cv::imwrite(strSavePath, image);
        //cv::waitKey(0);
    }
}

2)购买棋盘格或者圆点标定板

3)购买高精度平面镜子

4)购买一个屏幕

(二)标定过程:

(1)使用购买的棋盘格或者圆点标定板对单目相机标定,或者双目相机标定

(2)放置镜子,让相机采集到屏幕上的棋盘格图案。放置至少三个位置,采集至少三张图像。

(3)使用参考文章中的标定方法,通过三张采集图像计算得到屏幕到相机的旋转、平移变换矩阵。

(4)使用相机到虚像的旋转和平移矩阵,以及屏幕到相机的旋转、平移矩阵,计算剩下n张图像的镜面距离和法向。

(5)全局优化,优化(屏幕到相机的旋转和平移矩阵,每一个图像下的镜子法向和相机中心到镜子的距离)

(三)结果:

1.标定结果如下:

全局优化结果,第一列是图像编号,第二列是棋盘格点编号,第三列是投影误差,可以看到标定误差基本都在0.1个像素之内。

2.第0副屏幕、相机、镜子、虚像之间的关系显示:

B点的夹角是180度,表示,A,B,C是在一条直线上的。

距离一致

垂直法向一致

3.验证法向

可以看到acos求角平分线和法向之间的反余弦值,发现是吻合的。

(四)注意事项:

1.相机标定的时候,标定板的精度一定要高一点,如果不高,我发现在标定过程中,如果相机标定误差是镜面标定误差的3倍的时候,优化出来的镜子大小和相机到镜子之间的距离也会发现严重的失真,发生等比例缩放【笑哭】,一直找不到问题,后来发现是这个问题。

2.一定不要放弃。

参考文章:

Flexible geometrical calibration for fringe-reflection 3D measurement

fringe-reflection photogrammetry based on poses calibration with planar mirror reflection

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习