在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用,包括目标识别、图像配准、视觉跟踪、三维重建等。这个概念的原理是,从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像。
*检测图像中的角点
角点是很容易在图像中定位的局部特征,并且大量存在于人造物体中。角点的价值在于它是两条边缘线的接合点,是一种二维特征,可以被精确地定位(即使是子像素级精度)
Harris特征检测是检测角点地经典方法。
OpenCV中检测Harris角点地基本函数是cv::cornerHarris.调用该函数时输入一个图像,返回地结果是一个浮点型图像,其中每个像素点表示角点强度。
原图:
效果:
代码:
HarrisDetector类:
class HarrisDetecter
{
private:
cv::Mat cornerStrength; //32位浮点数型的角点强度图像
cv::Mat cornerTh; //32位浮点数型的阈值化角点图像
cv::Mat localMax; //局部最大值图像
int neighbourhood; //平滑导数的邻域尺寸
int aperture; //梯度计算的口径
double k; //Harris参数
double maxStrength; //阈值计算的最大强度
double threshold; //计算得到的阈值
int nonMaxSize; //非最大抑制的邻域尺寸
cv::Mat kernel; //非最大抑制内核
public:
HarrisDetecter() :neighbourhood(3), aperture(3), k(0.01), maxStrength(0.0), threshold(0.01), nonMaxSize(3)
{
setLocalMaxWindowSize(nonMaxSize);
}
void setLocalMaxWindowSize(int size)
{
nonMaxSize = size;
kernel.create(nonMaxSize, nonMaxSize, CV_8U);
}
void detect(const cv::Mat& image)
{
cv::cornerHarris(image, cornerStrength, neighbourhood, aperture, k);
//计算内部阈值
double minStrength;
cv::minMaxLoc(cornerStrength, &minStrength, &maxStrength);
//检测局部最大值
cv::Mat dilated;
cv::dilate(cornerStrength, dilated, cv::Mat());
cv::compare(cornerStrength, dilated, localMax, cv::CMP_EQ);
}
//用Harris值得到角点分布图
cv::Mat getCornerMap(double qualityLevel)
{
cv::Mat cornerMap;
threshold = qualityLevel*maxStrength;
cv::threshold(cornerStrength, cornerTh, threshold, 255, cv::THRESH_BINARY);
cornerTh.convertTo(cornerMap, CV