当前位置:   article > 正文

OpenCV-Python(42):摄像机标定_python中使用opencv进行单目摄像头标定

python中使用opencv进行单目摄像头标定

目标

  • 学习摄像机畸变以及摄像机的内部参数和外部参数
  • 根据摄像机相关参数对畸变图像进行修复

基础说明 

        今天的低价单孔摄像机(照相机)会给图像带来很多畸变。畸变主要有两种:径向畸变和切向畸变。如下图所示用红色直线将棋盘的两个边标注出来,但是你会发现棋盘的边界并不和红线重合。所有我们认为应该是直线的也都凸出来了。

这种畸变可以通过下面的方程组进行纠正:

        于此相似,另外一个畸变是切向畸变,这是由于透镜与成像平面不可能绝对平行造成的。这种畸变会造成图像中的某些点看上去的位置会比我们认为的位置要近一些。它可以通过下列方程组进行校正:

        简单来说,如果我们想对畸变的图像进行校正就必须找到五个造成畸变的系数:

        除此之外,我们还需要再找到一些信息,比如摄像机的内部和外部参数。内部参数是摄像机特异的。它包括的信息有焦距(fx, fy),光学中心(cx, cy)等。这也被称为摄像机矩阵。它完全取决于摄像机自本身,只需要计算算一次以后就可以已知使用了。可以用下面的3x3 的矩阵表示:

        外部参数与旋转和变换向量相对应,它可以将3D点的坐标转换到坐标系系统中。 

        在3D 相关应用中,必须先校正这些畸变。为了找到这些参数,我们必须先提供一些包含明显图案模式的样本图片(比如说棋盘)。我们可以在上面找到一些特殊点(如棋盘的四个角点)。我们起到这些特殊点在图片中的位置以及它们的真实位置。有了这些信息,我们就可以使用数学方法求解畸变系数。这就是整个故事的摘要了。为了得到更好的结果我们至少需要10 个这样的图案模式。

代码 

         如上所述,我们至少需要10 图案模式来进行摄像机标定。OpenCV 自带了一些棋盘图像(/sample/cpp/left001.jpg--left14.jpg), 所以我们可以使用它们。为了便于理解我们可以认为仅有一张棋盘图像。重要的是在进行摄像机标定时我们需要输入一组3D 真实世界中的点以及与它们对应2D 图像中的点。2D 图像的点可以在图像中很容易的找到。(这些点在图像中的位置是棋盘上两个黑色方块相互接触的地方)

        那么真实世界中的3D 的点呢?这些图像来源与静态摄像机和棋盘不同的摆放位置和朝向。所以我们需要知道(X,Y,Z)的值。但是为了简单,我们可以说棋盘在XY 平面是静止的(所以Z 总是等于0)摄像机在围着棋盘移动。这种假设我们只需要知到(X,Y) 的值就可以了。现在为了求X,Y 的值,我们只需要传入这些点(0,0),(1,0),(2,0)...它们代表了点的位置。在这个例子中,我们的结果的单位就是棋盘(单个)方块的大小。但是如果我们知道单个方块的大小(假如

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/341152
推荐阅读
相关标签