角点/兴趣点/特征点:特征明显的点。
具体描述:
- 灰度的梯度的局部最大所对应的像素点
- 两条及两条以上边缘的交点
- 图像中梯度值和梯度方向的变换速率都很高的点
角点检测应用于运动检测,图像匹配,视频跟踪,三维建模和目标识别。
图像的特征类型:
- 边缘
- 感兴趣关键点(角点)
- 感兴趣区域(斑点)
阻挠:光照变换和图像旋转的变化会使已有角点的特征变化。
角点检测算法
(1)基于灰度图像的角点检测
① 基于梯度
② 基于模板
主要考虑像素邻域点的灰度变化,将与邻域内亮度对比足够大的点定义未角点。
Kitchen-Rosenfeld算法
- Harris算法
void cornerHarris(InputArray src,
OutputArray dst,
int blockSize,
int ksize,
double k,
int borderType=BORDER_DEFAULT);
参数详解:
- 第一个参数:输入图像。须为单通道8位或者浮点型图像。
- 第二个参数:存放Harris角点检测的输出结果,和输入图像有一样的尺寸和类型。
- 第三个参数:邻域的大小
- 第四个参数:Sobel算子的孔径大小。
- 第五个参数:Harris参数。
- 第六个参数:图像像素的边界模式。默认值BORDER_DEFAULT。
程序实例
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME1 "【程序窗口1】"
#define WINDOW_NAME2 "【程序窗口2】"
Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 40;
int max_thresh = 175;
void on_CornerHarris(int, void*);
int main()
{
g_srcImage = imread("E://Study//RoboMaster//resource//3.jpg");
if (!g_srcImage.data)
{
printf("error!\n");
return false;
}
imshow("原始图", g_srcImage);
g_srcImage1 = g_srcImage.clone();
cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);
namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
createTrackbar("阈值:", WINDOW_NAME1, &thresh, max_thresh, on_CornerHarris);
on_CornerHarris(0, 0);
waitKey(0);
return(0);
}
void on_CornerHarris(int, void*)
{
Mat dstImage;
Mat normImage;
Mat scaledImage;
dstImage = Mat::zeros(g_srcImage.size(), CV_32FC1);
g_srcImage1 = g_srcImage.clone();
cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);
normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(normImage, scaledImage);
for (int j = 0; j < normImage.rows; j++)
{
for (int i = 0; i < normImage.cols; i++)
{
if ((int)normImage.at<float>(j, i) > thresh + 80)
{
circle(g_srcImage1, Point(i, j), 5, Scalar(10, 10, 255), 2, 8, 0);
circle(scaledImage, Point(i, j), 5, Scalar(0, 10, 255), 2, 8, 0);
}
}
}
imshow(WINDOW_NAME1, g_srcImage1);
imshow(WINDOW_NAME2, scaledImage);
}
- Shi-Tomasi
void goodFeaturesToTrack(InputArray image,
OutputArray corners,
int maxCorners,
double qualityLevel,
double minDistance,
InputArray mask = noArray(),
int blockSize = 3,
bool useHarrisDetector = false,
double k = 0.04);
参数详解:
- 第一个参数:输入图像。须为8位或浮点型32位单通道图像。
- 第二个参数:检测到的角点的输出向量。
- 第三个参数:角点的最大数量。
- 第四个参数:角点检测可接受的最小特征值。
- 第五个参数:角点间的最小距离。
- 第六个参数:感兴趣区域。默认值noArray()。
- 第七个参数:计算导数自相关矩阵时指定的邻域范围。默认值3。
- 第八个参数:指示是否使用Harris角点检测。默认false。
- 第九个参数:设置Hessian自相关矩阵行列式的相对权重的权重系数。默认值0.04。
-
KLT算法
-
SUSAN算法
③ 基于模板梯度组合
(2)基于二值图像的角点检测
(3)基于轮廓曲线的角点检测
亚像素级角点检测
void cornerSubPix(InputArray image,
InputOutputArray corners,
Size winSize,
Size zeroZone,
TermCriteria criteria)
参数详解:
- 第一个参数:输入图像。
- 第二个参数:提供输入角点的初始坐标和精确的输出坐标。
- 第三个参数:搜索窗口的一半尺寸。
- 第四个参数:死区的一般尺寸。
- 第五个参数:求角点的迭代过程的终止条件。