角点检测被定义两条边的交点, 在实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点, 而不仅仅是角点。
角点: 如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么将其称之为角点。
角点的性质
角点检测算法
基于灰度图像的角点检测
基于梯度
基于模板
主要考虑像素领域点的灰度变化,常见的基于模板的角点检测算法有:Kitchen-Rosenfeld, Harris, KLT以及SUSAN
角点检测。
基于模板梯度组合
基于二值图像的角点检测
基于轮廓曲线的角点检测
Harris角点检测: cornerHarris()函数
harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高。
cvtColor(srcimage, grayImage, COLOR_BGR2GRAY);
cornerHarris(grayImage, HarrImage, 2, 3, 0.01);
// 这里显示没有结果, 一片黑暗
//imshow("cornerHarris", HarrImage);
Mat harrisCorners;
threshold(HarrImage, harrisCorners, 0.00001, 255, CV_THRESH_BINARY);
imshow("cornerHarris2", harrisCorners);
该方法是对Harris算法的改进。
原始定义: 将矩阵M的行列式与M的迹****相减, 再将差值同预先给定的阈值进行比较。
改进方法:若两个特征值中较小的一个大于最小阈值,则会得到强角点。
RNG g_rng(12345);
Mat FeaturesTrack;
Mat copyrgb = srcimage.clone();
imshow("copyColor", copyrgb);
vector<Point2f> corners;
goodFeaturesToTrack(grayImage, corners, 150, 0.01, 10, Mat(), 3, false, 0.04);
cout<<"corners.size() = "<<corners.size()<<endl;
for(int i=0; i<corners.size(); i++)
{
circle(copyrgb, corners[i],4, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), 1, 8, 0);
}
imshow("Corners", copyrgb);
上面介绍的都是用于特征点的识别, 那么如果是要进行
几何测量
,上述方法可能就不太适合,因为他们提供的是像素的整数坐标值,而有时候我们需要实数坐标值。
亚像素精度(sub-Pixel): 像素与像素之间的还有更细小的单元,这就是亚像素,通常会是原来像素的几分之一的大小。
OpenCV函数 cornerSubPix()
cornerSubPix()函数用于寻找亚像素角点位置,不是整数型位置,而是更精确的浮点型位置。
相比于角点检测的位置,亚像素级的检测在点的结果上更加精确