角点检测是计算机视觉系统中用来获取图像特征的一种方法。我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了。其实说图像的特征,你可以尝试说一下这幅图有几个矩形啊几个圆形啊,有几条直线啊,当然啦,你也可以说一下有几个角点。
什么是角点?
角点通常被定义为两条边的交点。比如,三角形有三个角,矩形有四个角,这些就是角点,也是他们叫做矩形、三角形的特征,我们看到一些几何图形具有三个角,那么我们便可以脱口而出说这是一个三角形。
上面所说的是严格意义上的角点,但是从广义来说,角点指的是拥有特定特征的图像点,这些特征点在图像中有具体的坐标,并具有某些数学特征(比如局部最大或最小的灰度)。
图像特征类型可以被分为三种:
边缘
角点(感兴趣关键点)
斑点(感兴趣区域)
角点是个很特殊的存在。如果某一点在任意方向的一个微小的变动都会引起灰度很大的变化,那么我们就可以把该点看做是角点。
Harris 角点检测
Harris角点检测是一种直接基于灰度图的角点提取算法,稳定性高,尤其对L型角点(也就是直角)检测精度高。缺点也是明显的,就是运算速度慢。
OpenCV使用的相应函数是
void cornerHarris( InputArray src, OutputArray dst, int blockSize,int ksize, double k, int borderType = BORDER_DEFAULT );
下面给出相应的检测代码。
#include <opencv2/opencv.hpp> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv;using namespace std; Mat g_srcImage, g_srcImage1, g_grayImage;int thresh = 30; //当前阈值 int max_thresh = 175; //最大阈值 void on_CornerHarris(int, void*);//回调函数 int main(int argc, char** argv){ g_srcImage = imread("lol19.jpg", 1); if (!g_srcImage.data) { printf("读取图片错误! \n"); return&