博主联系方式:
QQ:1540984562
QQ交流群:892023501
群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。

目录

  • 原理讲解
    • 【1】为何选取角点作为特征?
    • 【2】角点的定义:
    • 【3】判断角点的方法:
    • 【4】Harris角点检测法
  • 示例
    • Opencv自带函数:cornerHarris()函数
    • 示例程序1
    • 示例程序2

原理讲解

【1】为何选取角点作为特征?

角点是一种局部特征。

角落上的可区分性特别强,边缘次之,平滑区域则基本没有区分性。

【2】角点的定义:

【3】判断角点的方法:


这里有个细节:将计算的所有方向上的变化值平方和的最小值作为像素点的灰度变化特征值。为何是最小值呢?
分别对平均区域、边缘区域、角落区域进行计算,观察结果:

取最小值,这样边缘的特征值为0了,将边缘与角点区分开来。(边缘的特点是一个方向变化值不明显,与之垂直的方向变化值明显)
这种方法的缺点:
滑动窗口缺点:窗口滑动只有8个方向,当边缘角落的角度不在这8个方向上则检测不准。

【4】Harris角点检测法

Harris角点检测法使用特征值的方式,使得任何方向上的角点都可以被检测出来。
数学定义:

加权函数形式:高斯分布形式、均值函数形式
公式继续化简:

泰勒公式回顾:


由于图像是二元函数,这里只取,x和y方向上的一阶导数做近似。


海森矩阵:



平原地区,四周望去皆是平坦,最陡峭和最不陡峭的地方陡峭程度差不多。
悬崖地区,水平方向上望去很平坦,从其垂直方向看去,十分陡峭。
站立山尖,四周皆是十分陡峭。
R称之为响应函数,k根据经验取0.02~0.04左右

示例

Opencv自带函数:cornerHarris()函数

void cornerHarris( InputArray src, OutputArray dst, int block Size,  int ksize, double k, int borderType = BORDER_DEFAULT)

1.InputArray类型的src,输入图像,即原图像,填Mat类型即可,且需要为单通道8位或者浮点型图像;
2.OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放Harris角点检测的输出结果,和原图片有一样的尺寸和类型;
3.int类型的blockSize,表示邻域的大小,更多详细信息在cornerEigenValsAndVecs()中讲到;
4.int类型的ksize,表示Sobel()算子的孔径的大小;
5.double类型的k,Harris参数;
6.int类型的borderType,图像像素的边界模式。注意它有默认值BORDER_DEFAULT;

示例程序1

int main()
{//改变控制台字体颜色system("color 02");//读取图像//Mat src_image = imread("D:\\opencv_picture_test\\霍夫变换\\霍夫变换.png", 0);Mat src_image = imread("D:\\opencv_picture_test\\角点检测\\五角星.jpg", 0);//出错判断if (!src_image.data){cout << "src image load failed!" << endl;return -1;}//进行角点检测,找出角点Mat cornerStrength;cornerHarris(src_image, cornerStrength,2,3,0.03);//对灰度图进行阈值操作,得到二值图并显示Mat harrisCorner;threshold(cornerStrength, harrisCorner,0.00001,255,THRESH_BINARY);//显示namedWindow("角点图", WINDOW_NORMAL);imshow("角点图", cornerStrength);namedWindow("二值图", WINDOW_NORMAL);imshow("二值图", harrisCorner);waitKey(0);return 0;
}

需要注意的是:角点计算后需要进行二值化才能较好地可视化角点。最好是归一化一下。
原图:

cornerStrength角点图:

harrisCorner二值化后的角点图:

示例程序2

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include <time.h>
#include <math.h>
//#include "My_ImageProssing_base.h"
#define WINDOW_NAME1 "【程序窗口1】"
#define WINDOW_NAME2 "【程序窗口2】"
using namespace cv;
using namespace std;
RNG g_rng(12345);//*--------------------------动态角点检测-------------------------------------*/Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 20;
int max_thresh = 205;
void on_CornerHarris(int ,void*);
int main()
{//改变控制台字体颜色system("color 02");//读取图像//Mat src_image = imread("D:\\opencv_picture_test\\霍夫变换\\霍夫变换.png", 0);g_srcImage = imread("D:\\opencv_picture_test\\角点检测\\五角星.jpg", 1);//出错判断if (!g_srcImage.data){cout << "src image load failed!" << endl;return -1;}//namedWindow("原始图", WINDOW_NORMAL);//imshow("原始图", g_srcImage);g_srcImage1 = g_srcImage.clone();cvtColor(g_srcImage1, g_grayImage,COLOR_BGR2GRAY);//创建窗口和滑动条namedWindow(WINDOW_NAME1, WINDOW_NORMAL);createTrackbar("阈值",WINDOW_NAME1,&thresh,max_thresh, on_CornerHarris);//初始化回调函数on_CornerHarris(0,0);waitKey(0);return 0;
}
void on_CornerHarris(int, void*)
{//定义局部变量Mat dstImage;Mat normImage;    //归一化Mat scaleImage;    //线性变换后的八位无符号整型的图//初始化,清除上一次调用次函数时他们的值dstImage = Mat::zeros(g_srcImage.size(),CV_32FC1);g_srcImage1 = g_srcImage.clone();//进行角点检测,找出角点Mat cornerStrength;cornerHarris(g_grayImage, dstImage, 2, 3, 0.03);//归一化与转换normalize(dstImage, normImage,0,255,NORM_MINMAX,CV_32FC1,Mat());convertScaleAbs(normImage, scaleImage);   //将归一化后的图线性变换成8位无符号整数//进行绘制for (int j = 0;j < normImage.rows;j++){for (int i = 0;i < normImage.rows;i++){Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值if ((int)normImage.at<float>(j, i) > thresh+60){circle(g_srcImage1,Point(i,j),5, color,2,8,0);circle(scaleImage, Point(i, j), 5, color, 2, 8, 0);}}}imshow(WINDOW_NAME1, g_srcImage1);imshow(WINDOW_NAME2, scaleImage);
}

需要注意的是,当阈值较小的时候,可能会“检测”出若干个角点,绘制时会卡住,所以需要限制一下,这里我们去最低为60。
效果:


参考资料:

《Opencv3编程入门.毛星云版》
《数字图像处理PPT.李竹版》

角点检测(Harris角点检测法)相关推荐

  1. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  2. opencv 实现角点检测 Shi-Tomasi角点检测

    角点检测概述 角点检测概述 Harris角点检测算法手动实现 Harris角点检测算法手动实现 opencv中使用Harris角点检测 opencv中使用Harris角点检测 opencv中使用 Sh ...

  3. harris角点检测_角点检测(2) - harris算子 - 理论与Python代码

    数字图像,图像=矩阵,[m*n]从[0,255]的灰度值 角点检测:物体边缘的拐点 ->应用:图像匹配与检索.图像物体形变恢复(摄像机标定).三维重建 Harris角点检测(早期,原理简单,视频 ...

  4. matlab角点坐标获取,MatLab角点检测(harris经典程序) | 学步园

    这是源博客的出处,鄙人转过来是为了更好的保存!供大家一起学习!已将原始的博客的文章的位置附在上面! 至于代码的完整性和可运行性需要大家去自己考量! %MatLab角点检测程序harris. ori_i ...

  5. OpenCV角点检测: Harris算子, ShiTomasi算子

    角点检测 角点的特征检测与匹配是Computer Vision 应用总重要的一部分,这需要寻找图像之间的特征建立对应关系.点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做&quo ...

  6. 【OpenCV十六新手教程】OpenCV角检测Harris角点检测

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨) ...

  7. python检测Harris角点

    1.python提取Harris角点 其实有在网上参考部分代码,但是,有些博客的博主可能连代码都没跑过,直接网上找资源就粘贴在自己的博客下了,然而有些代码是会报错的 第一行就报错:SyntaxErro ...

  8. matlab角点检测fast_AGAST角点检测算法:比FAST和FAST-ER更快

    了解更多信息请参阅出版类的论文 成员 Publication [1] Elmar Mair, Gregory D. Hager, Darius Burschka, Michael Suppa, and ...

  9. Harris的角点检测和特征匹配

    一.特征检测(提取) 基于特征的图像配准方法是图像配准中最常见的方法之一.它不是直接利用图像像素值,二十通过像素值导出的符号特征(如特征点.特征线.特征区域)来实现图像配准,因此可以克服利用灰度信息进 ...

  10. 角点检测和匹配之Harris与FAST角点检测

    这一章主要内容: 1. Harris角点检测 2. FAST特征检测 3. 尺度不变的SURF特征检测 4.SURF检测描述 一.引言 在计算机视觉中,特征点或称兴趣点,角点(即图像的极值点,线段的终 ...

最新文章

  1. 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问...
  2. W3C api 抓取
  3. 对称加密算法 - Java加密与安全
  4. 语义分割深度学习方法集锦
  5. django-ckeditor表情包修改
  6. mysql 修改密码演练
  7. ios 性能优化之图形性能测试
  8. 市场上常见电阻阻值表
  9. Java个人博客项目
  10. 数字信号处理 史林 课本答案---第一章
  11. 为知笔记使用自建docker服务后,如何迁移原有账号数据
  12. 浏览器被恶意篡改怎么办?
  13. Idea的快捷功能使用统计
  14. 充电电流的大小是谁决定的?
  15. 很不错的教程一步步教你如何写Makefile
  16. react-dom.development.js:6202 Unable to preventDefault inside passive event listener invocation 错误
  17. 回到顶部丝滑效果/指定位置下拉丝滑
  18. fNIRS中的假阳性和假阴性:问题、挑战和方法
  19. idc销售管理系统php版,ESM企业销售管理系统 v3.0
  20. 进程间通信那种效率最高_几种进程间的通信方式 比较

热门文章

  1. 计算机企业锻炼总结,计算机教师企业锻炼总结汇报2021【5篇】.docx
  2. Java微信二次开发之14-自定义菜单及菜单响应事件的推送
  3. Java学习路线-42:SQL进阶:约束、关系、连接
  4. Microsoft Office如何打开Visual Basic编辑器(macOS)
  5. 征文:中秋,你愿意和她一起打地(月)鼠(饼)吗?
  6. 利用java创建文件或者文件夹
  7. Java小白入门200例86之Java方法重载
  8. kafak、flume、elasticsearch
  9. 微信小程序相机组件的使用
  10. JAVA 计算两个日期间的时间间隔