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

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

(一)准备:

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

相关推荐
通信小呆呆8 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
H__Rick8 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee8 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Alsn868 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
YM52e8 天前
买菜计算器小应用 - HarmonyOS ArkUI 开发实战-PC版本
学习·华为·harmonyos·鸿蒙·鸿蒙系统
小雨下雨的雨8 天前
HarmonyOS ArkUI训练营入门-组件掌握系列-Animation 动画效果实现-PC版本
学习·华为·harmonyos·鸿蒙
cqbzcsq8 天前
CellFlow虚拟细胞论文阅读
论文阅读·人工智能·笔记·学习·生物信息
YangYang9YangYan8 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
guslegend8 天前
理论学习:什么是 Coding Agent?
学习
自传.8 天前
尚硅谷 Vibe Coding|第三章(1) Claude Code深度使用与进阶技巧 学习笔记
笔记·学习·尚硅谷·vibecoding