相机标定--内参之绝对圆锥曲线

原文链接:https://blog.csdn.net/yhl_leo/article/details/49357087

绝对圆锥曲线

在进一步了解相机标定前,有必要了解绝对圆锥曲线(Absolute Conic)这一概念。

我们定义一个假象的平面\Pi _{_{\infty }},这个平面在三维空间中处于无穷远处,对于一个3D空间的点X,其齐次坐标为:X=[x_{1},x_{2},x_{3},x_{4}]^{T}。如果这个点在平面\Pi _{_{\infty }}内,则应当满足x_{4}=0

再做一条假设,在三维空间中任意平面中的圆,它在平面\Pi _{_{\infty }}上的投影都必经过两个点c_{1}=(1,\vec{i},0), c_{2}=(1,-\vec{i},0),这两个点叫circle points,这也是为什么在一平面内确定一个圆只需要3个点,而确定其他二次曲线需要5个点。那么,三维空间中任一个圆在平面\Pi _{_{\infty }}处的circle points组成了绝对圆锥曲线Absolute Conic,记作\Omega

由平面\Pi _{_{\infty }}和绝对圆锥曲线\Omega的性质可得, \Omega上的点X=[x_{1},x_{2},x_{3},x_{4}]^{T}满足

                                                   \left\{\begin{matrix} x_{1}^{2}+x_{2}^{2}+x_{3}^{2} = 0 & \\ x_{4} = 0 & \end{matrix}\right.
X^{T}X=0。读至此处,我们发现不管是\Pi _{_{\infty }}\Omega,都是存粹想象出来的,很难在实际生活里找到实例,但是科学就是这么迷人,给定一个起始点,想象和求知探索的渴求却不受其限制,直至永无止境。

此时,或许我们会困惑,为什么要费尽心机想象出绝对圆锥曲线呢?原因在于绝对圆锥曲线所具有的一条重要特性:对于刚体变换具有不变性,这么说是不是有点不明觉厉,那就继续往下看。

首先简单讲一下刚体变换:只有物体的位置(平移变换)和朝向(旋转变换)发生改变,而形状不变,得到的变换称为刚体变换。以三维刚体变换为例:

                                                             x=[R , t]X
或者表述为: 
                                           x=RX + t   或者 x=R(x+C)

H=\begin{bmatrix} R & t \\ 0& 1\end{bmatrix},对于位于绝对圆锥曲线\Omega上的点x_{\Omega }=\begin{bmatrix} x_{\infty}\\ 0 \end{bmatrix},刚体变换后的点x_{\Omega }^{'}可表示为:

                                                      x_{\Omega }^{'}=Hx_{\Omega }=\begin{bmatrix} Rx_{\infty }\\ 0 \end{bmatrix}
x_{\Omega }^{'}很明显也是位于无穷远平面\Pi _{_{\infty }}上的点,而且是位于同一绝对圆锥曲线\Omega上点:

                                           x_{\Omega }^{'T}x_{\Omega }^{'}=(Rx_{\infty })^{T}(Rx_{\infty })=x_{\infty }^{T}R^{T}Rx_{\infty }=0
令绝对圆锥曲线\Omega在成像平面对应的图像称为w,也被简记为IAC(Image of the absolute conic),当然这也是想象出来的~于是对于\Omega上的任一点x_{\infty },其成像点m_{\infty }满足:

                                                     m_{\infty }=sK[R|t]\begin{bmatrix} x_{\infty }\\ 0 \end{bmatrix}=sKRx_{\infty }
                                                 m_{\infty }^{T}K^{-T}K^{-1}m_{\infty }=s^{2}x_{\infty}^{T}R^{T}Rx_{\infty}=0
因此,绝对圆锥曲线的成像构成一个虚构曲线,这个虚拟曲线由K^{-T}K^{-1}决定,这与相机的外参完全无关,而仅仅由相机内参决定。可以设想,如果我们找到了绝对圆锥曲线通过相机所成的图像,那就可以求解出相机内参。至此,我想大家也就明白为什么会提出Absolute Conic这一概念了吧。事实上,这一理论在相机自检校标定法(Self-calibration)中作为基础理论,十分重要。

后续文章将会为大家介绍几种确定绝对圆锥曲线\Omega对应的图像w的方法。
 

您好!关于相机标定,OpenCV是一个非常强大的库,它提供了相机标定的函数,可以用来解决相机的畸变问题。而tbb是Intel开发的一个并行计算库,可以加速OpenCV的一些计算,提高程序的性能。 在使用OpenCV进行相机标定时,可以使用以下函数: ```cpp double calibrateCamera(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, Size imageSize, InputOutputArray cameraMatrix, InputOutputArray distCoeffs, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags = 0, TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 30, DBL_EPSILON)); ``` 其中,objectPoints和imagePoints是分别包含了世界坐标系和相机坐标系下的点的向量,imageSize是图像的大小,cameraMatrix和distCoeffs是输出的相机内参矩阵和畸变系数矩阵,rvecs和tvecs是输出的旋转矩阵和平移矩阵,flags是标定的方式,TermCriteria是停止条件。 如果要加速计算,可以使用tbb库提供的并行计算能力。具体可以参考以下代码: ```cpp cv::setNumThreads(num_threads); //设置OpenCV使用的线程数 cv::parallel_for_(cv::Range(0, num_images), [&](const cv::Range& range) { for (int i = range.start; i < range.end; ++i) { cv::Mat rvec, tvec; cv::solvePnP(object_points_, image_points_[i], camera_matrix_, dist_coeffs_, rvec, tvec); rvecs_[i] = rvec; tvecs_[i] = tvec; } }); ``` 这段代码使用了parallel_for_函数进行并行计算,加速了求解每个图像的旋转矩阵和平移矩阵的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值