《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测

第10章 角点检测

10.1 Harris角点检测

10.1.1 角点

1.图像特征类型:
(1)边缘
(2)角点(感兴趣点)
(3)斑点(感兴趣区域)
2.角点定义:
(1) 一阶导数(灰度的梯度)的局部最大所对应的像素点
(2)两条及两条以上边缘的交点
(3)图像中梯度值和梯度方向的变化速率都很高的点
(4)角点处的一阶导数最大,二阶导数为0,指示了物体边缘变化不连续的方向
3.角点检测算法:
(1)基于灰度图像的角点检测
  1)基于梯度
  2)基于模板
    考虑像素邻域点的灰度变化,将与邻域点亮度对比足够大的点定义为角点
    常见算法:Kitchen-Rosenfeld角点检测、Harris角点检测、KLT角点检测、SUSAN角点检测
  3)基于模板梯度组合
(2)基于二值图像的角点检测
(3)基于轮廓曲线的角点检测

10.1.2 harris角点检测

1.作用:
  基于灰度图像的角点提取算法,运行Harris角点检测算子进行角点检测
2.原理:
  和cornerMinEigenVal()以及cornerEigenValsAndVecs()函数类似,cornerHarris函数对于每一个像素(x,y)在blockSize*blockSize邻域内,计算2*2梯度的协方差矩阵M(x,y),然后找出输出图中局部最大值,即找出角点:
                在这里插入图片描述
3.函数原型:

void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT)

4.参数说明:
(1)输入图像,单通道8位或浮点型图像
(2)存放Harris角点检测输出结果,与原图像一样尺寸和类型
(3)邻域大小
(4)Sobel()算子孔径大小
(5)Harris参数
(6)图像像素边界模式,默认BORDER_DEFAULT

10.1.3 示例程序

1.Harris角点检测

#include
#include
#include
using namespace cv;
int main()
{
	//载入灰度图像并显示
	Mat srcImage = imread("1.jpg", 0);
	imshow("【原始图】", srcImage);

	//进行Harris角点检测
	Mat cornerStrength;
	cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);

	//对灰度图进行阈值操作,得到二值图并显示
	Mat harrisCorner;
	threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);
	imshow("【角点检测后的二值效果图】", harrisCorner);

	waitKey(0);
	return 0;
}

运行效果:
《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第1张图片《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第2张图片
2.Harris角点检测与绘制

/*
	程序说明:滑动条调节阈值,以控制harris检测角点数量
*/
#include
#include
#include
#include
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【程序窗口1】"
#define WINDOW_NAME3 "【程序窗口2】"
//全局变量
Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 30;
int max_thresh = 175;
//全局函数
void on_CornerHarris(int, void*);
int main()
{
	//载入原图
	g_srcImage = imread("1.jpg");
	if (!g_srcImage.data)
	{
		printf("载入原图失败~!\n");
		return false;
	}
	imshow(WINDOW_NAME1, g_srcImage);

	g_srcImage.copyTo(g_srcImage1);
	cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);
	
	//创建滑动条并初始化
	namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);
	createTrackbar("阈值:", WINDOW_NAME2, &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_srcImage.copyTo(g_srcImage1);
	
	//角点检测
	cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);
	//归一化与转换
	normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
	convertScaleAbs(normImage, scaledImage);//将归一化后的图线性变换成8位无符号整型
	//将检测到的,符合阈值条件的角点绘制出来
	for (int i = 0; i < normImage.rows; i++)
	{
		for (int j = 0; j < normImage.cols; j++)
		{
			if ((int)normImage.at<float>(i, j) > thresh + 80)
			{
				circle(g_srcImage1, Point(j, i), 5, Scalar(10, 10, 255), 2, 8, 0);
				circle(scaledImage, Point(j, i), 5, Scalar(0, 10, 255), 2, 8, 0);
			}
		}
	}
	imshow(WINDOW_NAME2, g_srcImage1);
	imshow(WINDOW_NAME3, scaledImage);
}

运行效果:
《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第3张图片
《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第4张图片《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第5张图片
《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第6张图片《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测_第7张图片

你可能感兴趣的:(OpenCV)