OpenCV实战(16)——角点检测详解

Posted 盼小辉丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV实战(16)——角点检测详解相关的知识,希望对你有一定的参考价值。

OpenCV实战(16)——角点检测详解

0. 前言

在计算机视觉中,兴趣点 (interest points) 也称为关键点 (keypoints) 或特征点 (feature points),广泛用于解决对象识别、图像匹配、视觉跟踪、3D 重建等领域的问题。与其将图像作为一个整体进行评估,不如选择可以用于局部分析的点,以获得将该点应用于局部或全局的信息。只要在图像中检测到足够数量的关键点,并且这些点具有可以精确定位的独特且稳定的特征,就能够利用这些点进行图像分析。

1. Harris 特征检测器

在图像中搜索特征点时,角点 (corners) 是一个重要特征,角点

OpenCV 例程300篇238. OpenCV 中的 Harris 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程 300篇】238. OpenCV 中的 Harris 角点检测

角是直线方向的快速变化。角点通常被定义为两条边的交点,或者说角点的邻域应该具有两个不同区域的不同方向的边界。

角是高度有效的特征。角点检测(Corner Detection)广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别。


6.1 哈里斯-斯蒂芬斯角检测器(Harris)

在基于灰度变换的角点检测算法中,Harris 算法重复性良好、检测效率较高,应用较为广泛。

哈里斯-斯蒂芬斯角检测器(Harris and Stephens)的原理是,通过检测窗口在图像上移动,计算移动前后窗口中像素的灰度变化。角点是两条边的交点,其特征是检测窗口沿任意方向移动都会导致灰度的显著变化。

对于点 ( x , y ) (x,y) (x,y),令 w ( x , y ) w(x,y) w(x,y) 为矩形检测窗口或高斯检测窗口, I ( x , y ) I(x,y) I(x,y) 是检测窗口在点 ( x , y ) (x,y) (x,y) 的灰度值, I ( x + u , y + v ) I(x+u,y+v) I(x+u,y+v) 是检测窗口滑动 ( u , v ) (u,v) (u,v) 距离之后的灰度值。

计算窗口 w ( x , y ) w(x,y) w(x,y) 滑动 ( u , v ) (u,v) (u,v) 距离之后的灰度变化:
E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v) = \\sum _x,y w(x,y) [I(x+u, y+v) - I(x,y)]^2 E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2
对于很小的位移 ( u , v ) (u,v) (u,v),使用一阶泰勒展开进行简化:

E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x , y ) + u I x + v I y + O ( u 2 , v 2 ) − I ( x , y ) ] 2 ≈ ∑ x , y w ( x , y ) [ u 2 I x 2 + 2 u v I x I y + v 2 I y 2 ] ≈ [ u , v ] ∑ x , y w ( x , y ) [ I x I x I x I y I x I y I y I y ] [ u v ] \\beginalignedE(u,v) = &\\sum_x,y w(x,y) [I(x,y) + uI_x + vI_y +O(u^2,v^2)- I(x,y)]^2 \\\\\\approx & \\sum_x,y w(x,y) [u^2 I_x^2 + 2uv I_x I_y + v^2 I_y^2] \\\\\\approx & [u,v] \\sum_x,yw(x,y)\\beginbmatrixI_x I_x & I_x I_y \\\\I_x I_y & I_y I_y\\endbmatrix\\beginbmatrixu\\\\v\\endbmatrix\\endaligned E(u,v)=x,yw(x,y)[I(x,y)+uIx+vIy+O(u2,v2)I(x,y)]2x,yw(x,y)[u2Ix2+2uvIxIy+v2Iy2][u,v]x,yw(x,y)[IxIxIxIyIxIyIyIy][uv]
I x , I y I_x,I_y Ix,Iy 分别是在 x, y 方向的导数,可以由 Sobel 梯度算子求出。

记 M 为梯度的协方差矩阵:
M = ∑ x , y w ( x , y ) [ I x I x I x I y I x I y I y I y ] M =\\sum_x,y w(x,y)\\beginbmatrixI_x I_x & I_x I_y \\\\I_x I_y & I_y I_y\\endbmatrix M=x,yw(x,y)[IxIxIxIyIxIyIyIy]

在几何模型中通过判断两个特征值的大小,来判定像素的属性。矩阵 M 是 I x , I y I_x,I_y IxIy 的二次函数,可以表示为椭圆形状,椭圆的长短半轴由矩阵 M 的特征值 λ 1 , λ 2 \\lambda _1,\\lambda _2 λ1λ2 决定,方向由特征向量决定。

定义角点响应函数 R:
R = d e t ( M ) − k [ t r a c e ( M ) ] 2 d e t ( M ) = λ 1 ∗ λ 2 t r a c e ( M ) = λ 1 + λ 2 \\beginalignedR =& det(M) - k [trace(M)]^2 \\\\&det(M) = \\lambda _1 * \\lambda _2 \\\\&trace(M) = \\lambda _1 + \\lambda _2\\endaligned R=det(M)k[trace(M)]2以上是关于OpenCV实战(16)——角点检测详解的主要内容,如果未能解决你的问题,请参考以下文章

cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

OpenCV实战(17)——FAST特征点检测

OpenCV 例程300篇238. OpenCV 中的 Harris 角点检测

OpenCV 例程300篇238. OpenCV 中的 Harris 角点检测