精华内容
下载资源
问答
  • 处理旋转矩阵的问题时,通常采用旋转矩阵的方式来描述,也可以用旋转向量来表示,两者之间可以通过罗德里格斯(Rodrigues)变换来进行转换。 其中,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。 ...

    摄像机标定中的外部参数矩阵,是由旋转矩阵和平移矩阵构成的,旋转矩阵是一个3×3的正交矩阵,有3个自由度。处理旋转矩阵的问题时,通常采用旋转矩阵的方式来描述,也可以用旋转向量来表示,两者之间可以通过罗德里格斯(Rodrigues)变换来进行转换。


    其中,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。

    norm为求向量的模。反变换也可以很容易的通过如下公式实现:


    在opencv中的函数为:

    int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );

    例子如下:

    展开全文
  • 修改:标定不用修改……matlab内置的已经很强大了,而且没有必要用python和c++再做一遍,因此考虑的方法为——matlab标定后,参数导入到opencv中使用,这也是应用到python的一个原因。 一、matlab标定工具箱 matlab...

    这一章由来:二郎之前研究matlab的双目立体视觉,已经得到了需要的信息,可是,二郎想要对代码进行修改使其更适宜自己的应用目的。
    修改:标定不用修改……matlab内置的已经很强大了,而且没有必要用python和c++再做一遍,因此考虑的方法为——matlab标定后,参数导入到opencv中使用,这也是应用到python的一个原因。

    一、matlab标定工具箱

    matlab提供了两种方法:1.用自带的app进行标定(在双目立体视觉的文章中有详细讲解);2.用matlab标定工具箱,像下面这样的东西
    在这里插入图片描述
    与其说它是一个工具箱,更确切地说它就是没有被matlab集成到内部,可以看到的m文件。
    用法非常简单,下载在网上找一下,很多,或者找二郎要……吐槽一下,有的博主把这些东西挂到CSDN卖积分……感觉好不地道。
    http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html(一篇英文教程,不想看英文的也可以接着文章往下看,二郎给大家做一遍)
    1.下载的压缩包解压……到哪都行
    在这里插入图片描述
    这里需要注意……点进来之后,要把这个文件夹添加到执行目录,要不后续无法进行。
    2.运行文件
    在这里插入图片描述
    3.选择进入程序
    在这里插入图片描述
    4.将图片目录添加到执行目录,且进入图片目录
    在这里插入图片描述
    5.以此运行,不用设置参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    点完后,去看matlab命令行窗口
    在这里插入图片描述
    上面二郎之前做过所以又记录,其实是需要输入棋盘格的尺寸的,也就是那个30,30
    在这里插入图片描述
    …………然后就一直持续标四个点,直至标完所有,二郎认为大家肯定会出现在标定中小手一抖,标跑偏的现象,没关系,后面能修改,先把四个点都标上再说。
    表完之后点计算标定
    在这里插入图片描述
    在这里插入图片描述
    你会发现我们想要求得值就出来了。然后用分析一下错误,可以看到我们哪张图错误率较大

    在这里插入图片描述
    我们可以用一下重投影,将我们求得内外参数代入公式,算出各点,带回到图像,计算误差(当然,这一步是计算机做的),重投影主要是为了recop.corners计算提高精度。再次确定角点时,以重投影的角点为起始角点,开始寻找角点。
    在这里插入图片描述
    做完上面一些步骤后我们的精度已经得到明显的提高
    之后就可以针对单张图来进行操作了,比如再进行一下步骤3,这次不选所有图,而是单独找我们之前标错的图,进行重新的角点标注。在重新计算角点时,可以人为地设置窗口大小,之前默认为5*5,可以适当调大或者缩小。
    多次进行角点检测的方法
    第二次:Recomp.corners→[9,9]
    第三次:Recomp.corners→[8,8]
    第四次:Recomp.corners→[7,7]
    逐渐缩小角点检测的窗口,避免产生窗口过小,造成的局部误差。

    双目标定
    当我们左右相机的单目标定完成后,将标定结果进行保存,建议保存名字为
    (Calib_Result_left.mat和Calib_Result_right.mat)
    运行工具箱里的stereo_gui.m
    在这里插入图片描述
    导入数据(Calib_Result_left.mat和Calib_Result_right.mat),进行双目标定。

    二、旋转矩阵和旋转向量

    从上面的介绍中可以看到matlab已经集成的标定程序和标定工具箱各有各自的优点,弄哪一个都是可以的。在matlab已经集成的标定程序使用时,我们的2相机相对于1相机的旋转关系为旋转矩阵(9个参数),然而,在opencv和python中,多数程序使用的数据为旋转向量(3个参数)形式,这里涉及了一个转换定理——罗德里格斯(Rodrigues)旋转向量与矩阵的变换
    在这里插入图片描述
    图片截取于:https://wenku.baidu.com/view/b471efda6037ee06eff9aef8941ea76e58fa4acb.html?from=search
    在这里插入图片描述
    而具体如何实现旋转矩阵和旋转向量的转换呢?
    下面列出了程序
    python程序——程序不是二郎写的,来自github,方便大家看,因此黏贴过来。
    https://github.com/blzq/tf_rodrigues/commit/338758887a18f0db4e4a38c949be120d7f5169e3#diff-c5ff043af7299aff712f4dc2fb35bba3

    #!/usr/bin/python3
    # -*- encoding: utf-8 -*-
    
    import tensorflow as tf
    
    def rodrigues_batch(rvecs):
        """ 
        Convert a batch of axis-angle rotations in rotation vector form shaped
        (batch, 3) to a batch of rotation matrices shaped (batch, 3, 3).
        See
        https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula#Matrix_notation
        https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle
        --- second article is wrong?
        """
        batch_size = tf.shape(rvecs)[0]
    
        thetas = tf.norm(rvecs, axis=1, keepdims=True)
        u = rvecs / thetas
    
        # Each K is the cross product matrix of unit axis vectors
        # pyformat: disable
        zero = tf.zeros([batch_size])  # for broadcasting
        Ks_1 = tf.stack([  zero   , -u[:, 2],  u[:, 1] ], axis=1)  # row 1
        Ks_2 = tf.stack([  u[:, 2],  zero   , -u[:, 0] ], axis=1)  # row 2
        Ks_3 = tf.stack([ -u[:, 1],  u[:, 0],  zero    ], axis=1)  # row 3
        # pyformat: enable
        Ks = tf.stack([Ks_1, Ks_2, Ks_3], axis=2)                  # stack rows
    
        Rs = tf.eye(3, batch_shape=[batch_size]) + \
             tf.sin(thetas)[..., tf.newaxis] * Ks + \
             (1 - tf.cos(thetas)[..., tf.newaxis]) * tf.matmul(Ks, Ks)
    
        print(Rs.shape)
        return Rs
    
    # For testing only
    if __name__ == '__main__':
        import numpy as np
        import cv2
        rvecs = np.random.randn(4, 3).astype(np.float32)
    
        rvecs_tf = tf.constant(rvecs)
        Rs = rodrigues_batch(rvecs_tf)
        with tf.Session() as sess:
            print("TensorFlow: ")
            print(sess.run(Rs))
    
        print("\nOpenCV: ")
        for rvec in rvecs:
            mat, _ = cv2.Rodrigues(rvec)
            print(mat.T)
            print()
    

    opencv的程序——来自网上,具体出处不明(输入旋转向量则转化为旋转矩阵,输入旋转矩阵,则转化为旋转向量)

    #include <stdio.h>
    #include <cv.h>
    
    void main()
    {
        int i;
        double r_vec[3]={-2.100418,-2.167796,0.273330};
        double R_matrix[9];
        CvMat pr_vec;
        CvMat pR_matrix;
    
        cvInitMatHeader(&pr_vec,1,3,CV_64FC1,r_vec,CV_AUTOSTEP);
        cvInitMatHeader(&pR_matrix,3,3,CV_64FC1,R_matrix,CV_AUTOSTEP);
        cvRodrigues2(&pr_vec, &pR_matrix,0);
    
        for(i=0; i<9; i++)
        {
            printf("%f\n",R_matrix[i]);
        }
    }
    

    同样,可以去opencv官网:https://docs.opencv.org/3.4.0/d9/d0c/group__calib3d.html#ga61585db663d9da06b68e70cfbf6a1eac

    Mat rvec1, tvec1;
    solvePnP(objectPoints, corners1, cameraMatrix, distCoeffs, rvec1, tvec1);#求旋转矩阵
    Mat rvec2, tvec2;
    solvePnP(objectPoints, corners2, cameraMatrix, distCoeffs, rvec2, tvec2);
    Mat R1, R2;
    Rodrigues(rvec1, R1);#实现旋转矩阵向旋转向量的转换
    Rodrigues(rvec2, R2);
    

    三、opencv所需标定结果格式(matlab)

    在这里插入图片描述
    在这里插入图片描述
    Radial:径向畸变,光学透镜的特性使得成像存在着径向畸变(k1,k2,k3),k3可以有,也可以为0。
    Tangen:切向畸变,装配方面的误差,传感器与光学镜头不在同一水平线,可由两个参数P1,P2确定。
    这里提一下,畸变参数的排列(K1,K2,P1,P2,K3)(用在opencv中)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    Mat cameraMatrixL = (Mat_<double>(3, 3) << 904.0589, 0, 656.6037,
        0, 869.2423, 308.9319,
        0, 0, 1);
    //对应matlab里的左相机标定矩阵
    
    Mat distCoeffL = (Mat_<double>(5, 1) << 0.3370, -0.1561, -0.0245, 4.2596e-4, 0.0000);
    //对应Matlab所得左i相机畸变参数
            
    Mat cameraMatrixR = (Mat_<double>(3, 3) << 903.1359, 0, 659.2396,
        0, 870.4047, 321.2040,
        0, 0, 1);
    //对应matlab里的右相机标定矩阵
    
    Mat distCoeffR = (Mat_<double>(5, 1) << 0.3338, -0.0631, -0.0105, -0.0022, 0.00000);
    //对应Matlab所得右相机畸变参数
    
    Mat T = (Mat_<double>(3, 1) << -118.9937, 2.5308, -1.8361);//T平移向量
                                                        //对应Matlab所得T参数
    Mat rec = (Mat_<double>(3, 1) << XXXXX, XXXXXX,XXXXX);//rec旋转向量,对应matlab om参数,这里需要把旋转矩阵变为旋转向量
    Mat R;//R 旋转矩阵
    

    下面opencv的代码可以参照博文:https://blog.csdn.net/xiao__run/article/details/78900652

    展开全文
  • 由于摄像机标定中会使用到旋转矩阵以及旋转向量的知识,所以就整理了一下有关与这一部分基础知识的笔记,并进行详细的数学推导。 旋转矩阵 如果已经上面的三个角度ϕ\phiϕ、θ\thetaθ、ψ\psiψ,,我们可以通过...

    前言
    由于摄像机标定中会使用到旋转矩阵以及旋转向量的知识,所以就整理了一下有关与这一部分基础知识的笔记,并进行详细的数学推导。
    旋转矩阵
    在这里插入图片描述
    如果已经上面的三个角度ϕ\phiϕ、θ\thetaθ、ψ\psiψ,,我们可以通过将每一步的旋转矩阵相乘得到整个旋转矩阵。

    R=Rx∗Ry∗RzR=R_x * R_y *R_z

    旋转向量
    相机标定中表示旋转的方式,除了使用前面介绍的旋转矩阵之外,还可以使用旋转向量来表示。

    我在网上搜索相关资料时,发现大多数都是直接给出了Rodrigue旋转向量的公式,而没有推导过程。如果只是拿来用,那肯定是没问题的,但是不把它的公式推导一遍,心里总是有点不踏实。(好吧,我知道我有点废话)下面我会给出我自己的证明步骤,在最后会给出公式。
    在这里插入图片描述

    展开全文
  • 三维坐标变换——旋转矩阵与旋转向量

    万次阅读 多人点赞 2018-02-24 23:25:17
    用 opencv 进行过双目相机标定的同学都知道,单目标定 calibrateCamera() 函数能够对每一张标定图像计算出一对 rvec 和 tvec,即旋转平移向量,代表世界坐标系到相机坐标系的转换关系。而 stereoCalibrate() 函数则...

    用 opencv 进行过双目相机标定的同学都知道,单目标定 calibrateCamera() 函数能够对每一张标定图像计算出一对 rvec 和 tvec,即旋转平移向量,代表世界坐标系到相机坐标系的转换关系。而 stereoCalibrate() 函数则可以计算出旋转矩阵 R 和平移向量 T,代表左右相机坐标系之间的转换关系。同样是坐标变换,平移倒总是向量,但旋转怎么有时是向量,有时又是矩阵呢?


    旋转矩阵

    参考csxiaoshui的博客,三维旋转变换可以看成是矩阵乘法运算,即:

    xyz=Rxyz[x′y′z′]=R∗[xyz]
    其中 RR 就是三阶的旋转矩阵。仅仅考虑绕 XXYYZZ 单个轴旋转 θθ (右手螺旋),RR 分别为:
    RX=1000cosθsinθ0sinθcosθRY=cosθ0sinθ010sinθ0cosθRZ=cosθsinθ0sinθcosθ0001RX=[1000cosθ−sinθ0sinθcosθ]RY=[cosθ0sinθ010−sinθ0cosθ]RZ=[cosθ−sinθ0sinθcosθ0001]
    绕任意轴旋转则可以分解成绕三个坐标轴旋转的叠加,最终得到的旋转矩阵 RR 便是上述三个矩阵的乘积。

    矩阵运算显然是计算机三维坐标变换最简单方便的计算方法,因此在 opencv、opengl、工业机器人等开发中,提到位姿旋转变换,多半用的是旋转矩阵。然而,用矩阵来表示一个旋转关系有两个缺点:
    首先,通过旋转矩阵不能直观地看出旋转的方向和角度,假设给定一个旋转矩阵,要求旋转方向不变,旋转角度变成一半,那么新的旋转矩阵计算起来就比较麻烦了。
    另一方面,旋转变换本身只有3个自由度,但旋转矩阵有9个元素,因此旋转矩阵中的元素不是相互独立的,这在非线性优化中会带来问题。


    旋转向量

    向量旋转公式最早由 Rodrigues 提出,用一个三维向量来表示三维旋转变换,该向量的方向是旋转轴,其模则是旋转角度。百度百科中有其详细的介绍与推导,我在这边只列一下最重要的公式。
    设旋转向量的单位向量为 rr,模为 θθ。三维点(或者说三维向量)pp 在旋转向量 rr 的作用下变换至 pp′,则:

    p=cosθp+(1cosθ)(pr)r+sinθr×pp′=cos⁡θ⋅p+(1−cos⁡θ)(p⋅r)r+sin⁡θ⋅r×p
    显然,旋转向量代表的变换关系十分直观,但运算上要比矩阵形式更加复杂。

    相互转换

    用矩阵形式和向量形式表示旋转变换各有优劣势,因此经常需要来回转换,这里跟数学中的李群与李代数有所关联,本人目前还一知半解,可以参考半闲居士的博客
    opencv 中有函数 Rodrigues() 用于旋转矩阵和旋转向量的转换。参照opencv文档,设旋转向量的单位向量 r=[rx ry rz]Tr=[rx ry rz]T,旋转角度为 θθ,对应的旋转矩阵为 RR,则 rrRR 的转换是:

    R=cosθI+(1cosθ)rrT+sinθ0rzryrz0rxryrx0R=cos⁡θI+(1−cos⁡θ)rrT+sin⁡θ[0−rzryrz0−rx−ryrx0]
    其中 II 是三阶单位矩阵。反过来 RRrr 的转换则可以利用等式:
    RRT2=sinθ0rzryrz0rxryrx0R−RT2=sin⁡θ[0−rzryrz0−rx−ryrx0]

    opencv 官方文档中的原话是:

    A rotation vector is a convenient and most compact representation of a rotation matrix (since any rotation matrix has just 3 degrees of freedom). The representation is used in the global 3D geometry optimization procedures like calibrateCamera, stereoCalibrate, or solvePnP .

    称旋转向量是旋转矩阵方便而且最紧凑的表示方法,被用于一些需要全局三维几何优化的函数中。

    展开全文
  • 旋转向量-旋转矩阵

    千次阅读 2015-07-22 17:32:24
    今天接触到摄像机标定,其中用到旋转矩阵的知识,就具体恶补学习了一下,顺便做个笔记。物体在空间中的旋转物体在三维空间中的旋转,可以被分为解为在直接坐标系下,分别先后围绕x,y,z坐标轴旋转得到。旋转的角度也...
  • matlab标定工具箱中的旋转矩阵说明

    千次阅读 2019-08-03 12:59:31
    1、利用matlab标定工具箱进行双目视觉标定获得的om即为两相机之间的旋转向量。T为平移向量。 2、而后续计算需要的是旋转矩阵。因此有必要将mo旋转向量转为旋转矩阵。 3、于是利用罗德里格斯(Rodrigues)旋转方程...
  • 现有双目相机标定的方法是通过矩阵变换求得各个相机间的旋转平移关系,再通过优化求得最终参数。非线性优化步骤多,相机内外参数与镜头畸变存在耦合,时间花费较大。提出一种畸变矫正与平面单应性矩阵结合的双目相机...
  • 标定结果表明,主点坐标误差不超过1.8 pixel,Z分量相对平移向量的最大偏差值小于0.15 mm,姿态数为10或10以上时标定结果趋于稳定。借助于精密位移台对标定结果进行了精度验证,结果表明采用所提方法标定后位移测量...
  • 我第一次动手标定一个相机就发现标定结果中旋转矩阵尺寸是3乘1,我很疑惑因为课上一直讲是3*3的旋转矩阵,于是找了很多博客都没有个解答,最后还是请教了师兄才知道其中的原理,因为得到的根本就不是旋转矩阵,而是...
  • 误差约为0.03像素点,代码修改中解释,文件包含标定图和标定结果文件,可自行修改。可获取相机内外参数,取其中一幅图的旋转向量和平移向量,即为外参
  • 它的行列式为1,且每个列向量都是单位向量且相互正交,它的逆等于它的转置。 推荐博客:https://www.cnblogs.com/caster99/p/4703033.html 该博客从坐标轴出发,详细介绍了旋转矩阵的本质含义,即旋转矩阵R中的矩阵...
  • 我们会用到18章的一些概念,比如说内参数矩阵M,畸变参数,旋转矩阵等内容。目前来说,还没有可靠的方法能够在单幅图像的情况下进行标定和提取三维信息。在立体视觉中,通过把从不同摄像机同时获取的两个或更多的...
  • 当知道了三维旋转过程,大家对外参矩阵的旋转向量会有个清楚的了解,也就了解到旋转向量的正交性特征。 2. 外参为何只需要两个旋转向量和一个平移向量? 从世界坐标系到摄像机坐标系的坐标变换其实就是一个刚体...
  • 摄像机模型与标定——摄像机标定

    千次阅读 2016-09-26 08:13:00
    摄像机的内参数:摄像机内参数矩阵(fx,fy,cx,cy)和畸变系数(三个径向k1,k2,...摄像机的外参数:旋转向量(大小为1×3的矢量或旋转矩阵3×3)和平移向量(Tx,Ty,Tz)。 这里我们讲解一下旋转向量旋转向量
  • 这里先分析一下张氏标定的 闭式解(解析解) 1. 预备知识 => 1.1. 从像素坐标系(u,v) 到 世界坐标系(Xw,Yw,Yw) 公式如下: ...=> 1.2....=> 1.3....第一点 : 旋转向量 R 为正交
  • * 输出:内参数矩阵、畸变系数、旋转向量、旋转矩阵、平移向量 * 运行环境:Linux + eclipse (windows下也可以照常运行) */ #include #include #include using namespace std; int image_width = 640
  • 相机标定 matlab

    2018-05-24 21:58:54
    r就是旋转向量旋转向量的方向是旋转轴 ,旋转向量的模为围绕旋转轴旋转的角度。 通过上面的公式,我们就可以求解出旋转矩阵R。同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量: 。
  • 手眼标定

    千次阅读 2018-03-07 16:00:35
    两种情形 手眼标定系统一般有两种情况:一种是相机固定在机械手末端,一种是...其中baseHcal表示基础坐标系到标定物坐标系的转化关系,包括旋转矩阵和平移向量; camHtool表示相机坐标系到机械手坐标系的转化关系...
  • 算法首先假定主点位于像面中心附近的某个位置,再求出焦距、旋转矩阵、平移向量和比例因子,最后通过评价函数将相机标定转换成寻找两相机最佳主点对的非线性最小化问题。在传统进化策略中引进个体的自我改进系数、个体...
  • 相机标定

    2015-05-27 17:32:43
    使用棋盘的目的就是在不知道棋盘像素坐标和对应的三维坐标的前提下通过从不同的角度拍摄的N张像片来获取棋盘点的像素坐标和目标点坐标,从而得到相机的内参数矩阵和旋转平移向量。本实验跳过棋盘标定环节,基于已知...
  • 标定的的含义就是找到不同传感器的三维坐标变换,一共六个自由度,三个平移,三个旋转向量 假定在一个标定场内,两个传感器对同一物体的不同位置获取一套坐标 Pi(Xm,Ym, Zm) Pj(Xn, Yn, Zn) ....
  • 为实现手眼关系平移向量标定,提出以固定于机械臂末端的激光笔来获取工件平台上特征点的基坐标,并结合已标定旋转矩阵来标定平移向量。最后,从图像求取多个特征点之间的距离并与实际值进行误差比较,平面特征点...
  • 手眼标定方法汇总

    2020-10-30 10:00:13
    旋转矩阵和平移向量进行解耦,该方法需要已知相机的内部参数,通过内部参数与标定点坐标来计算旋转矩阵和平移向量。该算法的缺点在于旋转矩阵正交化之后再求出平移部分,而此时平移部分的解不再满足手眼矩阵。 ...
  • 前言 头部驱动除了之前关注的表情驱动外,还有眼球驱动和头部方向驱动。...cv.solvePnP位姿估计旋转向量精度分析 头部姿态估计原理及可视化 重磅!头部姿态估计「原理详解 + 实战代码」来啦! 相机矩
  • matlab和opencv双目标定的使用

    千次阅读 2018-03-07 10:47:13
    matlab双目标定的版本是在2016b以后的版本才有。...个人测试后认为opencv双目标定的平移向量和matlab标定的平移向量一样,都是右相机坐标系下的点转换到左相机坐标系下的平移向量,但是旋转向量不一样,...
  • 术语内参矩阵: Intrinsic Matrix焦距: Focal Length主点: Principal Point径向畸变: Radial Distortion切向畸变: Tangential Distortion旋转矩阵: Rotation Matrices平移向量: Translation Vectors平均重投影误差: ...
  • 摄像机标定

    2016-05-30 19:58:19
    2.外参:摄像机坐标系相对于某一世界坐标系的位置和方向,包括3*3的旋转矩阵R和一个平移向量T。摄像机标定方法分类: 1.传统摄像机标定法2.摄像机自标定方法3.基于主动视觉的标定法。基本相机模型1.理解相机模型中...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 138
精华内容 55
关键字:

旋转向量标定