opencv相机内参标定_opencv分割算法

opencv相机内参标定_opencv分割算法LM算法在相机标定的应用共有三处。(1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参。OpenCV中对应的函数为findExtrinsicCameraParams2。(2)单目标定中,在内外参都不固定的情况下,计算最佳内外参。OpenCV中对应的函数为calibrateCamera2。(3)双目标定中,在左右相机的内外参及左右相机的位姿都不固定的情况下,计算最佳的左右相机的内外参及最佳的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

LM算法在相机标定的应用共有三处。

(1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参。OpenCV中对应的函数为findExtrinsicCameraParams2。

(2)单目标定中,在内外参都不固定的情况下,计算最佳内外参。OpenCV中对应的函数为calibrateCamera2。

(3)双目标定中,在左右相机的内外参及左右相机的位姿都不固定的情况下,计算最佳的左右相机的内外参及最佳的左右相机的位姿矩阵。OpenCV中对应的函数为stereoCalibrate。

本文文阅读前提是你已经对LM(Levenberg-Marquardt)算法有足够的了解。因为本文主要是分析LM算法在相机标定中应用。

本文的分析是基于OpenCV的源码,所以可参见OpenCV的源码阅读此文。

0变量设置

设标定板上角点数为m,标定过程中拍摄n幅视图(对双目标定而言,左右相机各抓取n幅视图)。

关于相机的成像模型和畸变模型,我这里就不占空间了,详见OpenCV官方文档或相关论文。我用如下函数表示:

opencv相机内参标定_opencv分割算法

其中,(u,v)是像素坐标,(X,Y,Z)是世界坐标,R=(r1, R2, R3)T是旋转外参,T=(T1, T2, T3)T是平移外参,A=(fx, fy, cx, cy)T是投影内参,D=(k1, k2, p1,p2, k3, k4, k5, k6, s1, s2, s3, s4, a, b)T是畸变内参。

纵所周知,(u,v)是存在畸变的(后文称之为畸变坐标),我们用(uu,vv)表示(u,v)对应的非畸变的坐标(后文称之为标准坐标)。我们用findChessboardCorners提取的角点坐标就被当作是标准坐标。

1计算最佳外参

在内参固定的情况下,我们需要计算最佳外参。于是成像模型简化为:

opencv相机内参标定_opencv分割算法

对于m个角点则有如下方程:

opencv相机内参标定_opencv分割算法

其中(Xi, Yi, Zi)是已知项。计算雅可比矩阵如下:

opencv相机内参标定_opencv分割算法

由J可得J和JTJ。

若给定初值(R0, T0)则可得畸变角点序列uv=(u1,v1, u2,v2,…,um,vm)T。若findChessboardCorners获得的标准角点序列为uuvv=(uu1, vv1, uu2, vv2, …, um, vm)T,则误差序列为E=uv-uuvv。于是最终的方程为:

opencv相机内参标定_opencv分割算法

解方程后可得更精确的(R1, T1)=(R0, T0)-σ。

注意:以上可能与其它LM算法介绍有些差异。按大多数LM算法的介绍文档应是E=uuvv-uv, (R1, T1) = (R0, T0) +σ。不过仔细观察会发现最终结果其实一样的。我只不过是为了与OpenCV中源码对应才这样写的。

2计算最佳内外参

在内外参都不固定的情况下,成像模型应为:

opencv相机内参标定_opencv分割算法

与计算最佳外参不同。计算最佳外参是针对一幅视图,优化目标是使此幅视图的重投影误差最小。而计算最佳内外参,是针对多幅视图,优化目标是使所有视图的重投影误差之和最小。每幅视图有各自的外参,但共用相同的内参。所以每幅视图像上的角点仅对内参和各自的外参存在偏导,对其它视图的外参的偏导为0。于是雅可比矩阵为:

opencv相机内参标定_opencv分割算法

其中,Jini和Jexi是第i幅视图对内参和自身外观的雅可比矩阵。Jini是n×18矩阵(因为18个内参所以18列),Jexi是n×6矩阵(因为6个外参所以6列),所以J是(n*n)×(18+6*n)的矩阵。

可算得:

opencv相机内参标定_opencv分割算法

opencv相机内参标定_opencv分割算法

3计算最佳左右相机的内外参及最佳左右相机的位姿矩阵

此步骤中的优化参数是两相机间的位姿矩阵(R, T),两相机的内参(A1, D1, A2, D2)及左两机外参序列(R1i, T1i)。其中左相机的外参(R2i, T2i)=(RR1i, RT1i+T)。于是左相机每幅视图上的角点只对(A1, D1, Ri, Ti)有偏导,对其它参数的偏导为0。而右相机每幅视图上的角点只对(R, T, A2, D2, R1i, T1i)有偏导,对其它参数的偏导为0。其中,对(R, T, R1i, T1i)的偏导来源于对(R2i, T2i)的偏导。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188197.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm 全局替换 快捷键_pycharm刷新快捷键

    pycharm 全局替换 快捷键_pycharm刷新快捷键写程序的时候突然忘了pycharm里替换的快捷键是啥,百度了一下,有人说是Shift+Ctrl+R,试了一下确实可以,不过把我整个工程里的文件全都改了,还撤销不回来的那种,不知道是咋匹配的,好想捶死那个人,写博客也不写清楚。。。pycharm在一个文件里替换Ctrl+R就可以了,血泪史,记录自己踩过的坑。…

    2022年8月26日
    9
  • 通过阿里云服务器部署flask项目详细步骤,从服务器选择开始

    通过阿里云服务器部署flask项目详细步骤,从服务器选择开始通过阿里云服务器部署flask项目详细步骤,从服务器选择开始1.购买服务器,我们目前选择镜像Ubuntu16.0464位的系统,因为这个系统目前运行比较稳定2.设施远程链接密码3.添加安全组4.利用ssh链接服务器5.先更新apt相关源6.mysql安装7.redis安装8.安装虚拟环境9.配置.bashrc修改.bashrc文件输入命令,打开.bashrc文件添加以下三行代码使.bashr…

    2022年6月18日
    32
  • Java就业前景和薪资状况,究竟怎么样呢?

    Java就业前景和薪资状况,究竟怎么样呢?在未来5年内,软件人才的需求将远大于供给。Java软件工程师是目前国际高端计算机领域就业薪资较高的一类软件工程师。看到这里有人问了:那Java的现实就业前景和薪资状况,究竟怎么样呢?1、Java工程师就业前景在美国、加拿大、澳大利亚、新加坡等发达国家和中等发达国家,Java软件工程师年薪均在4—15万美金,而在国内,Java软件工程师也有极好的工作机会和很高的薪水。一般情况下的Java软件工程师是分四个等级,从软件技术员到助理软件工程师,再到软件工程师,最后成为高级软件工程师。根据IDC的统计数字,

    2022年7月8日
    27
  • centos7卸载_关闭docker

    centos7卸载_关闭docker一、禁用和停止容器服务systemctldisabledockersystemctlstopdocker二、删除容器服务器yumremovedocker-*三、删除残留文件rm-rf/var/lib/docker/rm-rf/etc/docker/rm-rf/run/dockerrm-rf/var/lib/dockershimrm-rf/usr/libexec/docker/…

    2022年8月30日
    7
  • Ubuntu安装JDK教程

    Ubuntu安装JDK教程Ubuntu安装JDK教程jdk的下载和安装:1、打开浏览器,输入jdk的官网地址:https://www.oracle.com/java/technologies/javase-downloads.html,如图:2、找到需要下载的jdk版本,这里以1.8版为例,找到JavaSE8,点击JDKDownload,跳转到JavaSE8的下载页面,如图:3、找到对应的下载版本,我这里是Ubuntu64位的系统,需要找到linux64的jdk版本,点击进行下载,如图:4、下载成之后

    2022年7月12日
    17
  • 数据结构与算法(3)

    数据结构与算法(3)

    2021年11月12日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号