角点检测

角点/兴趣点/特征点:特征明显的点。

具体描述:

  1. 灰度的梯度的局部最大所对应的像素点
  2. 两条及两条以上边缘的交点
  3. 图像中梯度值和梯度方向的变换速率都很高的点

角点检测应用于运动检测,图像匹配,视频跟踪,三维建模和目标识别。

图像的特征类型:

  1. 边缘
  2. 感兴趣关键点(角点)
  3. 感兴趣区域(斑点)

阻挠:光照变换和图像旋转的变化会使已有角点的特征变化。

角点检测算法

(1)基于灰度图像的角点检测

① 基于梯度

② 基于模板

主要考虑像素邻域点的灰度变化,将与邻域内亮度对比足够大的点定义未角点。
Kitchen-Rosenfeld算法

  1. 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);
}
  1. 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。
  1. KLT算法

  2. SUSAN算法

③ 基于模板梯度组合

(2)基于二值图像的角点检测

(3)基于轮廓曲线的角点检测

亚像素级角点检测

void cornerSubPix(InputArray image,
				  InputOutputArray corners,
				  Size winSize,
				  Size zeroZone,
				  TermCriteria criteria)

参数详解:

  • 第一个参数:输入图像。
  • 第二个参数:提供输入角点的初始坐标和精确的输出坐标。
  • 第三个参数:搜索窗口的一半尺寸。
  • 第四个参数:死区的一般尺寸。
  • 第五个参数:求角点的迭代过程的终止条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值