张正友标定论文的解读和C++代码编写

这篇具有很好参考价值的文章主要介绍了张正友标定论文的解读和C++代码编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.概述

张正友标定相机内参是非常经典的标定算法,现在代码已经被集成到MATLAB和opencv里面。不过因为算法涉及到基础的相机坐标系、图像坐标系、公式推导,以及优化算法,故根据张正友论文进行分模块代码编写。

2.代码地址

https://github.com/Shelfcol/Zhangzhengyou_calib_cam_intrinsic

3.简单解析

此C++代码是根据张正友的步骤进行分模块编写的,自认为逻辑还是比较清晰。分别为:

求H、求K、求旋转平移、求畸变稀疏、Ceres优化

bool CamIntrCalib::Calibrate()
{
    std::cout << "Calibrate with Zhangzhengyou" << std::endl;
    if (ReadPics() && GetKeyPoints())
    {
        CalcH();
        // CalcHWithCV();
        // ValidateH();

        CalcK();
        CalcT();
        CalcDistCoeff();
        std::cout << "reproject error before ceres optimizing:" << std::endl;
        CalcRepjErr();
        Optimize();
        std::cout << "reproject error after ceres optimizing:" << std::endl;
        CalcRepjErr();
        return true;
    }
    return false;
}

代码里面也对比实现了调用opencv算法进行标定,主要的函数就是

        cv::calibrateCamera(corner_3d_vec, points_2d_vec_, cv::Size(points_per_col_, points_per_row_),
                            K, dist_coef, rvecs, tvecs, CV_CALIB_FIX_K3 | CV_CALIB_ZERO_TANGENT_DIST);

最终跟opencv算法的结果对比下,内参和冲投影误差的差别都在0.01以内,精度较高

参数

zhang(我们)

opencv

相机内参

fx=589.9421322083375

fy=589.0314402379594

u0=323.830691209651

v0=240.716451101392

fx=589.9534727708858

fy=589.043571094065

u0=323.8345405252027

v0=240.7136136327917

畸变系数

k1=0.08908862963423921

k2=-0.0927595079832754

k1=0.08907964252174579

k2=-0.09266222570771097

重投影误差

0.275026

0.274992

在编写代码的时候也遇到了一个跟平常算法不一样的结构体,卡了很久,就是cv::Size(col,row)是列在前。

具体算法公式的详细推导都写在论文后面了,代码里面也是对应着写的,所以大家可以直接去看github地址里面的论文和代码进行学习。

张正友标定论文的解读和C++代码编写

4.一点学习感受

有人问我opencv都有现成的库,为啥还要自己实现,我认为:

1)对论文的理解会在你真正编写和调试成功之后有质的飞跃,虽然你原本看似成功推导了公式,但是代码实现的时候你也会遇到很多问题,而一个个问题的解决会加深你的理解;

2)对opencv、ceres等库的使用也会更加熟悉;

3)对C++代码能力提升也是很有帮助的;

4)参加工作之后,我才深刻意识到,现实的工作需求是千奇百怪的,绝大多数优秀的开源代码并不是直接照搬就可以解决老板分配给你的任务,里面包含的思想才是真正对你有帮助的。而想对一个算法举一反三,就必须要对其具体思想和实现有深刻理解,而在时间有空的情况下,自己实现一遍理解是更加深刻的;如果没有那么多时间的话,对开源代码进行改进,或者给开源代码加一些其他开源代码的模块,比如给ORBSLAM加动态物去除,G2O改为Ceres之类的,你可以说有的代码已经实现了,但是我觉得你自己再去自己加一下,调试一下,你对整个代码的理解肯定会不一样的。

纸上得来终觉浅,绝知此事要躬行,加油吧,少年。

最后说一句,大家要是觉得对自己有帮助的话,还望不吝star哦。😃😃😃

5.Reference

论文: "A Flexible New Technique for Camera Calibration" (2000).

代码参考:

https://github.com/zhiyuanyou/Calibration-ZhangZhengyou-Method

https://github.com/SHU-FLYMAN/ZhangZhengYou文章来源地址https://www.toymoban.com/news/detail-445581.html

到了这里,关于张正友标定论文的解读和C++代码编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【三维重建】相机标定:张正友标定法

    本系列开始于2022.12.25,开始记录三维重建项目课题研究时的学习笔记,其中主要分为以下几部分组成: 一、相机成像及坐标系之间的转换关系 二、相机标定:张正友标定法 三、特征检测与匹配 四、运动恢复结构法 目录 系列文章目录 文章目录 前言 一、 标定目的 二、 张正

    2024年02月07日
    浏览(30)
  • 相机标定-张正友棋盘格标定法

    目录 1.针孔相机模型 2.相机成像过程 2.1  各个坐标系之间的转换 2.1.1 图像坐标系到像素坐标系  2.1.2 相机坐标系到图像坐标系  2.1.3世界坐标系到相机坐标系  2.1.4世界坐标系到像素坐标系 3.畸变与畸变矫正 3.1 畸变 3.2 畸变公式 4.相机标定原理 5.张正友标定法介绍 5.1张正友

    2024年01月16日
    浏览(32)
  • 三步骤详解张正友标定法

    1998年,张正友提出了基于二维平面靶标的标定方法,使用相机在不同角度下拍摄多幅平面靶标的图像,比如棋盘格的图像,然后通过对棋盘格的角点进行计算分析来进行相机标定(求解相机的内外参数)。 标准棋盘格图像 第一步:对每一幅图像得到一个映射矩阵(单应矩阵

    2024年02月03日
    浏览(35)
  • 张正友相机标定法原理与实现

    张正友相机标定法是张正友教授1998年提出的单平面棋盘格的相机标定方法。传统标定法的标定板是需要三维的,需要非常精确,这很难制作,而张正友教授提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来

    2024年02月04日
    浏览(37)
  • 相机标定张正友、opencv和halcon对比(1)

    本文将从基本标定开始,结合实际工作经验,分析张正友、opencv和halcon三者相机标定的深层原理与不同之处,内容比较多,如果出现错误请指正。 我们使用的镜头都是由多组镜片组成,它实际上是一种厚透镜模型,但是目前所有的相机标定是基于针孔模型来进行标定的,因此

    2024年02月03日
    浏览(30)
  • 【QT/OpenCV】QT实现张正友相机标定

    01、相机标定 机器视觉是采用相机成像来实现对三维场景的测量、定位、重建等过程。也是一个利用二维图像进行三维反推的过程,我们所处的世界是三维的,而图像或者照片是二维的。我们可以把相机认为是一个函数,输入量是一个三维场景,输出量是一幅二维图像。 正常

    2024年02月09日
    浏览(31)
  • 基于opencv的相机标定C++代码

    事先需要把标定图片放在images目录下:  calibdata.txt的内容是标定图片的路径+图片文件名称: 希望对大家有帮助!!!(目前我使用的VS是2019版本,opencv4_1_2)。 拍摄图像示例  标定结果保存在一个txt文件中:     输入:灰度图像image_gray;角点个数大小corner_size,如Size(9,6

    2024年02月05日
    浏览(27)
  • centerpoint论文和代码解读

      目录 一、序论 二、论文结构 三、代码 论文地址: https://arxiv.org/pdf/2006.11275.pdf  代码地址:tianweiy/CenterPoint (github.com) centorpoint是一种anchor-free的方法,直接预测物体的中心点,然后直接回归其whl,省去了anchor与GT匹配过程(传统的anchor-base方法需要计算GT和anchor的iou进行分配

    2024年02月12日
    浏览(27)
  • [论文阅读笔记18] DiffusionDet论文笔记与代码解读

    扩散模型近期在图像生成领域很火, 没想到很快就被用在了检测上. 打算对这篇论文做一个笔记. 论文地址: 论文 代码: 代码 首先介绍什么是扩散模型. 我们考虑生成任务, 即encoder-decoder形式的模型, encoder提取输入的抽象信息, 并尝试在decoder中恢复出来. 扩散模型就是这一类中的

    2023年04月08日
    浏览(45)
  • 【论文解读】用于代码处理的语言模型综述

    目录 1.简要介绍 2.代码处理的语言模型的评估 3.通用语言模型 4.用于代码处理的特定语言模型 5.语言模型的代码特性 6.软件开发中的LLM 7.结论与挑战 ​​​​​​​ 1.简要介绍 在这项工作中,论文系统地回顾了在代码处理方面的最新进展,包括50个+模型,30个+评估任务和5

    2024年01月18日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包