精华内容
下载资源
问答
  • [opencv] 极线校正

    2019-09-27 08:06:49
    校正 remap(imgR, imgRr, rmap[ 1 ][ 0 ], rmap[ 1 ][ 1 ], CV_INTER_AREA); // 右校正 Mat showImage(imageSize.height, 2 * imageSize.width,CV_8UC3); Rect rectLeft( 0 , 0 ,imageSize.width,imageSize...
    //R = Rr*inv(Rl); T = Tr - R*Tl;
        invert(RLeft,RLeft);
        Mat R = RRight.clone();
        gemm(R,RLeft,1,1,0,R);
        Mat T;
        gemm(R,TLeft,1,1,0,T);
        T = TRight - T;
    
        //计算旋转矩阵和投影矩阵
        Mat R1, R2, P1, P2, Q;
        stereoRectify(KLeft,Mat::zeros(1,5,CV_32F),KRight,Mat::zeros(1,5,CV_32F),
            imageSize,R,T,R1,R2,P1,P2,Q,CALIB_ZERO_DISPARITY,0);
        //计算映射
        Mat rmap[2][2];
        initUndistortRectifyMap(KLeft,Mat::zeros(1,5,CV_32F), R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][1]);
        initUndistortRectifyMap(KRight, Mat::zeros(1,5,CV_32F), R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][1]);
        remap(imgL, imgLr, rmap[0][0], rmap[0][1], CV_INTER_AREA);//左校正
        remap(imgR, imgRr, rmap[1][0], rmap[1][1], CV_INTER_AREA);//右校正
    
        Mat showImage(imageSize.height,2*imageSize.width,CV_8UC3);
        Rect rectLeft(0,0,imageSize.width,imageSize.height);
        Rect rectRight(imageSize.width,0,imageSize.width,imageSize.height);
        imgLr.copyTo(showImage(rectLeft));
        imgRr.copyTo(showImage(rectRight));
        
        for( int i = 0; i < imageSize.height; i += 32 )
        {
            line(showImage, Point(0, i), Point(2*imageSize.width, i), Scalar(0, 255, 0), 1, 8);
        }
    

     效果图:

     

     代码下载:https://github.com/zhanxiage1994/rectifyImages.git

    转载于:https://www.cnblogs.com/zhanxiage1994/p/6027645.html

    展开全文
  • Fusiello极线校正的论文,matlab程序和自己移植的在opencv上运行的程序,环境为ubuntu16.04,opencv2.4.9
  • 计算机视觉极线校正

    热门讨论 2013-04-25 21:00:05
    matlab代码 实现了matlab平台下的极线校正算法 很有效 界面友好
  • 经典的极线校正程序Fusiello_epipolarcode MATLAB完整源代码
  • Bouguet极线校正的方法

    千次阅读 2016-09-27 18:54:45
    Bouguet极线校正的方法

    在双目视觉中,我们对相机进行标定和校正,最终目的是使得两个相机的光轴完全平行,这样才能够继续后续的深度计算,三维重建。这样的校正在OPencv中采用的是Bouguet的极线校正的算法。读了一些文章,现在对bouguet极线校正做一下笔记。有一些还理解不透彻的地方,欢迎大家讨论和指正。




    校正前的左右相机的光心并不是平行的,两个光心的连线就叫基线,像平面与基线的交点就是极点,像点与极点所在的直线就是极线,左右极线与基线构成的平面就是空间点对应的极平面。


    校正后,极点在无穷远处,两个相机的光轴平行。像点在左右图像上的高度一致。这也就是极线校正的目标。校正后做后续的立体匹配时,只需在同一行上搜索左右像平面的匹配点即可,能使效率大大提高。


    Bouguet的方法,是将OPencv求解出来的旋转和平移矩阵分解成左右相机各旋转一半的旋转和平移矩阵R1,T1R2,T2。分解的原则是使得,左右图像重投影造成的畸变最小,左右视图的共同面积最大。


    Bouguet的方法的主要步骤如下:


    1、将右图像平面相对于左图像平面的旋转矩阵分解成两个矩阵RlRr,叫做左右相机的合成旋转矩阵。


                



    2、将左右相机各旋转一半,使得左右相机的光轴平行。此时左右相机的成像面达到平行,但是基线与成像平面不平行。


    3、构造变换矩阵Rrect使得基线与成像平面平行。构造的方法是通过右相机相对于左相机的偏移矩阵T完成的。


    1)构造e1。变换矩阵将左视图的极点变换到无穷远处,则使极线达到水平,可见,左右相机的投影中心之间的平移向量就是左极点方向:


                                                                                


    2e2方向与主光轴方向正交,沿图像方向,与e1垂直,则知e2方向可通过e1与主光轴方向的叉积并归一化获得。

                                                  

    3)获取了e1e2后,e3e1e2正交,e1自然就是他们两个的叉积:


                                                              

       则可将左相机的极点转换到无穷远处的矩阵Rrect如下:


                                                                                        


    4、通过合成旋转矩阵与变换矩阵相乘获得左右相机的整体旋转矩阵。左右相机坐标系乘以各自的整体旋转矩阵就可使得左右相机的主光轴平行,且像平面与基线平行。


                                                                      

    5、通过上述的两个整体旋转矩阵,就能够得到理想的平行配置的双目立体系图像。校正后根据需要对图像进行裁剪,需重新选择一个图像中心,和图像边缘从而让左、右叠加部分最大。


    注意:原文链接http://blog.csdn.net/wangxiaokun671903/article/details/38039383

    展开全文
  • 基于极线校正的亚像素相位立体匹配方法
  • 双目相机的畸变校正以及平行校正(极线校正)的入门问题总结

        做相机标定对于刚入手的人来说有很多疑惑的点,我总结个人的入手的方法和需要弄明白的问题:

    一、相机标定是干什么的,需要什么器材才能做?双目校正目标是什么,又需要什么设备?


    二、相机(针孔)模型是什么样的?世界坐标系,相机坐标系,图像物理坐标系,图像像素坐标系,这四个坐标系到底是什么?从世界坐标系到图像坐标系到底是怎么转换的?


    三、Opencv中用到的相机标定函数,对应的算法具体是什么?获得的各矩阵数据的含义指的是什么?


    四、获得单个相机的内参矩阵和畸变系数后,怎么对相机进行畸变校正?


    五、分别获得两个相机的内参矩阵和畸变系数,以及两相机之间的相对旋转平移矩阵后,怎样进行双目平行校正?校正的结果和流程应该是怎样的?


    这些问题如果搞清楚了,那么相机的畸变和平行校正的方法你一定也就明白了。


    对于上述问题,我目前的理解如下:


         一、
    相机标定就是要通过一定的方法对特定图像(棋盘格角点检测)计算出这个相机本身的一些参数,包扩:内参矩阵A,外参矩阵[R|T]、畸变系数[k1,k2,k3,~,p1,p2,~]内参矩阵各元素意义:一个像素的物理尺寸dxdy,焦距f,图像物理坐标的扭曲因子gama,图像原点相对于光心成像点的的纵横偏移量cxcy(像素为单位)外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。畸变系数:包括相机的径向畸变系数k1,k2,k3,~,和相机的切向畸变系数p1,p2,~需要的器材:一个黑白棋盘格的标定板,一个相机拍摄的不同角度或距离的棋盘格图像至少三张以上。


    双目校正就是通过一定的方法将两个摄像头拍摄同一个物体的图像进行处理,使得两幅图像最终达到下面的目标,同一个物体在两幅图像中的大小一样,且水平在一条直线上。需要的设备:双目摄像头(即两个同规格的摄像头水平放置左右摄像头),拍摄同一个物理的左右图像对,需要已知左右相机的内参矩阵、畸变系数、右相机相对于左相机的旋转矩阵R(通过一定的方法可将此矩阵分解成两个矩阵R1R2,即左右相机各旋转一半达到水平)。


    二、针孔相机的模型:三维世界中的物体,经过相机成像系统,变成二维图像过程如下所示。


    世界坐标系就是物体在真实世界中的坐标,比如黑白棋盘格的世界坐标系原点定在第一个棋盘格的顶点,Xw,Yw,Zw互相垂直,Zw方向就是垂直于棋盘格面板的方向。可见世界坐标系是随着物体的大小和位置变化的,单位是长度单位。只要棋盘格的大小决定了,无论板子怎么动,棋盘格角点坐标一般就不再变动(因为是相对于世界坐标系原点的位置不变),且认为是Zw=0.

    相机坐标系:以光心为相机坐标系的原点,以平行于图像的x和y方向为Xc轴和Yc轴,Zc轴和光轴平行,Xc,Yc,Zc互相垂直,单位是长度单位。

    图像物理坐标系:以主光轴和图像平面交点为坐标原点,x和y方向如图所示,单位是长度单位。

    图像像素坐标系:以图像的顶点为坐标原点,u和v方向平行于x和y方向,单位是以像素计。


         从世界坐标系到图像坐标系
    的转换过程如下:世界坐标系通过外参矩阵转换到相机坐标系,相机坐标系通过内参矩阵转换到图像像素坐标系(这一步是通过两步完成的,一,相机坐标系通过焦距对角矩阵和畸变系数转换到图像物理坐标系,二图像物理坐标系通过像素转换矩阵转换到像素坐标系中)。转换过程和公式如下(将在接下来的文章里详细说明):


          三、opencv中标定用到的重要函数和算法以及获取矩阵的含义

    findChessboardCorners()用来发现棋盘格的角点位置,这里用的是haaris角点检测方法。cornerSubPix()角点位置精确到亚像素级。

    stereoCalibrate()通过角点推算出两个相机的内参矩阵M1,M2畸变系数D1,D2,当然外参矩阵随之也就计算出来了(在图像校正中还没有用到外参),这里用到的是张正友相机标定算法

    stereoRectify()根据内参矩阵和畸变系数计算右相机相对于左相机的旋转R和平移矩阵T,并将这个旋转和平移矩阵分解成左、右相机各旋转一半的旋转R1,R2和平移矩阵T1,T2,这里用到的是bouguet极线校正的方法

    initUndistortRectifyMap()和remap()对左右相机拍摄的图像进行校正(在今后的文章中将会详细介绍实现方法和步骤)。


           四、获取了内参矩阵和畸变系数对图像进行畸变校正时,就是解决图像的畸变问题(径向畸变是因为透镜本身工艺的问题,切向畸变是由于安装问题带来的)。畸变校正的过程是这样的:1)将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴));2)通过畸变系数校正图像的相机坐标;3)校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标(用插值的方法,将在后面的文章中叙述)。


           五、双目平行校正,是针对图像对应的相机坐标系进行的,那么极线校正的时候应该注意就是在四中叙述的畸变校正过程中,在转换到相机坐标系后,左右图像对应的相机坐标系分别通过旋转矩阵R1和R2进行平行极线校正。步骤如下:1)将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴);2)通过旋转矩阵R1和R2进行平行极线校正;3)然后通过畸变系数校正图像的相机坐标;4)校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标


    注意:本文的原文链接http://blog.csdn.net/wangxiaokun671903/article/details/37935113

    展开全文
  • Bouguet极线校正进一步理解

    千次阅读 2015-10-11 15:25:21
    这样的校正在OPencv中采用的是Bouguet的极线校正的算法。读了一些文章,现在对bouguet极线校正做一下笔记。有一些还理解不透彻的地方,欢迎大家讨论和指正。 校正前的左右相机的光心并...

    在双目视觉中,我们对相机进行标定和校正,最终目的是使得两个相机的光轴完全平行,这样才能够继续后续的深度计算,三维重建。这样的校正在OPencv中采用的是Bouguet的极线校正的算法。读了一些文章,现在对bouguet极线校正做一下笔记。有一些还理解不透彻的地方,欢迎大家讨论和指正。




    校正前的左右相机的光心并不是平行的,两个光心的连线就叫基线,像平面与基线的交点就是极点,像点与极点所在的直线就是极线,左右极线与基线构成的平面就是空间点对应的极平面。


    校正后,极点在无穷远处,两个相机的光轴平行。像点在左右图像上的高度一致。这也就是极线校正的目标。校正后做后续的立体匹配时,只需在同一行上搜索左右像平面的匹配点即可,能使效率大大提高。


    Bouguet的方法,是将OPencv求解出来的旋转和平移矩阵分解成左右相机各旋转一半的旋转和平移矩阵R1,T1R2,T2。分解的原则是使得,左右图像重投影造成的畸变最小,左右视图的共同面积最大。


    Bouguet的方法的主要步骤如下:


    1、将右图像平面相对于左图像平面的旋转矩阵分解成两个矩阵RlRr,叫做左右相机的合成旋转矩阵。


                 



    2、将左右相机各旋转一半,使得左右相机的光轴平行。此时左右相机的成像面达到平行,但是基线与成像平面不平行。


    3、构造变换矩阵Rrect使得基线与成像平面平行。构造的方法是通过右相机相对于左相机的偏移矩阵T完成的。


    1)构造e1。变换矩阵将左视图的极点变换到无穷远处,则使极线达到水平,可见,左右相机的投影中心之间的平移向量就是左极点方向:


                                                                                


    2e2方向与主光轴方向正交,沿图像方向,与e1垂直,则知e2方向可通过e1与主光轴方向的叉积并归一化获得。

                                                  

    3)获取了e1e2后,e3e1e2正交,e1自然就是他们两个的叉积:


                                                              

       则可将左相机的极点转换到无穷远处的矩阵Rrect如下:


                                                                                        


    4、通过合成旋转矩阵与变换矩阵相乘获得左右相机的整体旋转矩阵。左右相机坐标系乘以各自的整体旋转矩阵就可使得左右相机的主光轴平行,且像平面与基线平行。


                                                                      

    5、通过上述的两个整体旋转矩阵,就能够得到理想的平行配置的双目立体系图像。校正后根据需要对图像进行裁剪,需重新选择一个图像中心,和图像边缘从而让左、右叠加部分最大。

    展开全文
  • 视觉测量中的极线校正程序

    热门讨论 2009-05-16 11:19:47
    立体视觉中的匹配技术主要采用极线约束,但一般极线为斜线,交与极点,直接利用这些极线进行匹配,其复杂度依然很高。该程序可以将极线校正到相互平行,降低匹配搜索的复杂度。
  • Fusiello极线校正方法的原理及C++实现

    千次阅读 2018-03-06 20:11:47
    在三维重建中,极线校正是很重要的一个环节,其作用就是把左右两个图像的进行变换,... 在opencv中其实也是自带了极线校正的API,如stereoRectify()函数,能够很好的进行极线校正。但是这篇文章是对Fusiello极线校...
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自:计算机视觉life为什么要做极线校正?三维重建是通过双目立体匹配实现的如图1,通过匹配空...
  • https://blog.csdn.net/wangxiaokun671903/category_2358341.html https://blog.csdn.net/rs_lys/article/details/83268491 https://blog.csdn.net/u013000248/article/details/85325136 等待补充代码
  • (注意:opencv 中前五个畸变参数顺序是 [k1, k2, p1, p2, k3]。 matlab 中如果开启了三个径向畸变,[k1, k2, k3] 确实在一起) 双目:https://blog.csdn.net/wangxiaokun671903/article/det...
  • 相机去畸变,以及双目平行校正----极线校正(一)————之单目畸变校正详细过程 http://blog.csdn.net/wangxiaokun671903/article/details/37973365 分类: 相机标定2014-07-21
  • opencv立体校正函数 stereoRectify()

    千次阅读 2019-07-02 11:53:16
    立体校正函数stereoRectify() stereoRectify()的作用是为每个摄像头计算立体校正的映射矩阵。所以其运行结果并不是直接将图片进行立体矫正,而是得出进行立体矫正所需要的映射矩阵。 调用方法: void ...
  • Opencv和Matlab都给了我们现成的函数,可以利用这些数据进行去畸变或者双目平行校正,因为有需求要将去畸变和平行校正移植到硬件上,那么自己如何利用这些参数和矩阵写去畸变的程序和双目平行校正的程序呢?...
  • opencv立体校正函数cvStereoRectify()纠错

    千次阅读 2012-07-23 08:49:16
    1、opencv中Bouguet校正方法对应的函数:cvstereorectify(),注意Flags参数的设置。Flags的默认设置为无穷远处的视差,即《learning opencv》p453,图12-4中的通常情景。不设置Flags参数,意味着我们想要摄
  • 原博客地址:相机畸变校正 上一篇博客简要介绍了一下常用的张正友标定法的流程,其中获取了摄像机的内参矩阵K,和畸变系数D。 1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2; p1; p2[; k3[; k4; k5; k6]...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 399
精华内容 159
关键字:

opencv极线校正