






















前面已经提及 goodFeaturesToTrack() 提取到的角点 只能达到像素级别,获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角点位置坐标,需要角点坐标达到亚像素(subPixel)精度。这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。
在亚像素级精度的角点检测算法中,一种方法是从亚像素角点到周围像素点的矢量应垂直于图像的灰度梯度这个观察事实得到的,通过最小化误差函数的迭代方法来获得亚像素级精度的坐标值。
$$ \begin{array}{c} I_{x}(p)\left(x_{q}-x_{p}\right)+I_{y}(p)\left(y_{q}-y_{p}\right)=0 \\ I_{x}(p) x_{q}+I_{y}(p) y_{q}=I_{x}(p) x_{p}+I_{y}(p) y_{p} \end{array} $$
$$ \left(\begin{array}{cc}I_{x}\left(p_{1}\right) & I_{y}\left(p_{1}\right) \\ \vdots & \vdots \\ I_{x}\left(p_{n}\right) & I_{y}\left(p_{n}\right)\end{array}\right)\left(\begin{array}{c}x_{q} \\ y_{q}\end{array}\right)=\left(\begin{array}{c}I_{x}\left(p_{1}\right) x_{p_{1}}+I_{y}\left(p_{1}\right) y_{p_{1}} \\ \vdots \\ I_{x}\left(p_{n}\right) x_{p_{n}}+I_{y}\left(p_{n}\right) y_{p_{n}}\end{array}\right) $$
$$ A=\left(\begin{array}{cc}I_{x}\left(p_{1}\right) & I_{y}\left(p_{1}\right) \\ \vdots & \vdots \\ I_{x}\left(p_{n}\right) & I_{y}\left(p_{n}\right)\end{array}\right), b=\left(\begin{array}{c}I_{x}\left(p_{1}\right) x_{p_{1}}+I_{y}\left(p_{1}\right) y_{p_{1}} \\ \vdots \\ I_{x}\left(p_{n}\right) x_{p_{n}}+I_{y}\left(p_{n}\right) y_{p_{n}}\end{array}\right) $$ $$ \begin{array}{c} A^{T} A\left(\begin{array}{l}x_{q} \\ y_{q}\end{array}\right)=A^{T} b \\ A^{T} A=\left(\begin{array}{cc}\sum I_{x}^{2} & \sum I_{x} I_{y} \\ \sum I_{x} I_{y} & \sum I_{y}^{2}\end{array}\right) \\ A^{T} b=\left(\begin{array}{l}\sum I_{x}^{2} x+\sum I_{x} I_{y} y \\ \sum I_{x} I_{y} x+\sum I_{y}^{2} y\end{array}\right) \\ \left(\begin{array}{l}x_{q} \\ y_{q}\end{array}\right)=\left(A^{T} A\right)^{-1} A^{T} b \end{array} $$
然后以新的 $ \left(x_{q}, y_{q}\right) $ 为初始角点,重新执行以上优化过程,反复迭代,直至 $ \left(x_{q}, y_{q}\right) $ 收敛。
1 | |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。