Harris角点检测算法

2018-12-04 16:53

Harris角点检测:

原理:利用矩形窗在图像上移动,若窗内包含有角点,则窗口向各个方向移动时,窗内的灰度值都会发生变化。从而达到检测图像角点的目的。 方法:

(增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。) 算法特点:

对亮度和对比度的变化不敏感;具有旋转不变性,但不具有尺度不变性;并不具备仿射不变性; 算法实现:

voiddetectHarrisCorners(const Mat& imgSrc, Mat& imgDst, double alpha) { Mat gray; if (imgSrc.channels() == 3) { cvtColor(imgSrc, gray, CV_BGR2GRAY); } else { gray = imgSrc.clone(); } gray.convertTo(gray, CV_64F); Mat xKernel = (Mat_(1, 3) << -1, 0, 1); Mat yKernel = xKernel.t(); Mat Ix, Iy; filter2D(gray, Ix, CV_64F, xKernel);

filter2D(gray, Iy, CV_64F, yKernel); Mat Ix2, Iy2, Ixy; Ix2 = Ix.mul(Ix); Iy2 = Iy.mul(Iy); Ixy = Ix.mul(Iy); Mat gaussKernel = getGaussianKernel(7, 1); filter2D(Ix2, Ix2, CV_64F, gaussKernel); filter2D(Iy2, Iy2, CV_64F, gaussKernel); filter2D(Ixy, Ixy, CV_64F, gaussKernel); Mat cornerStrength(gray.size(), gray.type()); for (int i = 0; i < gray.rows; i++) { for (int j = 0; j < gray.cols; j++) { double det_m = Ix2.at(i, j) * Iy2.at(i, j) - Ixy.at(i, j) * Ixy.at(i, j); double trace_m = Ix2.at(i, j) + Iy2.at(i, j); cornerStrength.at(i, j) = det_m - alpha * trace_m *trace_m; } } // threshold double maxStrength; minMaxLoc(cornerStrength, NULL, &maxStrength, NULL, NULL); Mat dilated; Mat localMax; dilate(cornerStrength, dilated, Mat()); compare(cornerStrength, dilated, localMax, CMP_EQ); Mat cornerMap; double qualityLevel = 0.01; double thresh = qualityLevel * maxStrength; cornerMap = cornerStrength > thresh; bitwise_and(cornerMap, localMax, cornerMap); imgDst = cornerMap.clone(); }

算法结果:

Kernel_size=7;k=0.01

OpencvAPI:

K=0.001

Opencv

K=0.1

opencv

附录:

算法执行过程:


Harris角点检测算法.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Zhang快速并行细化算法Java实现

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: