第10章 角点检测

10.1 Harris角点检测

10.1.1 角点

1.图像特征类型:
(1)边缘
(2)角点(感兴趣点)
(3)斑点(感兴趣区域)
2.角点定义:
(1) 一阶导数(灰度的梯度)的局部最大所对应的像素点
(2)两条及两条以上边缘的交点
(3)图像中梯度值和梯度方向的变化速率都很高的点
(4)角点处的一阶导数最大,二阶导数为0,指示了物体边缘变化不连续的方向
3.角点检测算法:
(1)基于灰度图像的角点检测
  1)基于梯度
  2)基于模板
    考虑像素邻域点的灰度变化,将与邻域点亮度对比足够大的点定义为角点
    常见算法:Kitchen-Rosenfeld角点检测、Harris角点检测、KLT角点检测、SUSAN角点检测
  3)基于模板梯度组合
(2)基于二值图像的角点检测
(3)基于轮廓曲线的角点检测

10.1.2 harris角点检测

1.作用:
  基于灰度图像的角点提取算法,运行Harris角点检测算子进行角点检测
2.原理:
  和cornerMinEigenVal()以及cornerEigenValsAndVecs()函数类似,cornerHarris函数对于每一个像素(x,y)在blockSize*blockSize邻域内,计算2*2梯度的协方差矩阵M(x,y),然后找出输出图中局部最大值,即找出角点:
                
3.函数原型:

void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT)

4.参数说明:
(1)输入图像,单通道8位或浮点型图像
(2)存放Harris角点检测输出结果,与原图像一样尺寸和类型
(3)邻域大小
(4)Sobel()算子孔径大小
(5)Harris参数
(6)图像像素边界模式,默认BORDER_DEFAULT

10.1.3 示例程序

1.Harris角点检测

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{//载入灰度图像并显示Mat srcImage = imread("1.jpg", 0);imshow("【原始图】", srcImage);//进行Harris角点检测Mat cornerStrength;cornerHarris(srcImage, cornerStrength, 2, 3, 0.01);//对灰度图进行阈值操作,得到二值图并显示Mat harrisCorner;threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY);imshow("【角点检测后的二值效果图】", harrisCorner);waitKey(0);return 0;
}

运行效果:

2.Harris角点检测与绘制

/*程序说明:滑动条调节阈值,以控制harris检测角点数量
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定义辅助宏
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【程序窗口1】"
#define WINDOW_NAME3 "【程序窗口2】"
//全局变量
Mat g_srcImage, g_srcImage1, g_grayImage;
int thresh = 30;
int max_thresh = 175;
//全局函数
void on_CornerHarris(int, void*);
int main()
{//载入原图g_srcImage = imread("1.jpg");if (!g_srcImage.data){printf("载入原图失败~!\n");return false;}imshow(WINDOW_NAME1, g_srcImage);g_srcImage.copyTo(g_srcImage1);cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);//创建滑动条并初始化namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);createTrackbar("阈值:", WINDOW_NAME2, &thresh, max_thresh, on_CornerHarris);on_CornerHarris(0, 0);waitKey(0);return 0;
}
void on_CornerHarris(int, void*)
{//局部变量Mat dstImage;//目标图Mat normImage;//归一化图Mat scaledImage;//线性变换后的八位无符号整型图//初始化//置零当前需要显示的两幅图,即清除上一次调用此函数时的值dstImage = Mat::zeros(g_srcImage.size(), CV_32FC1);g_srcImage.copyTo(g_srcImage1);//角点检测cornerHarris(g_grayImage, dstImage, 2, 3, 0.04, BORDER_DEFAULT);//归一化与转换normalize(dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat());convertScaleAbs(normImage, scaledImage);//将归一化后的图线性变换成8位无符号整型//将检测到的,符合阈值条件的角点绘制出来for (int i = 0; i < normImage.rows; i++){for (int j = 0; j < normImage.cols; j++){if ((int)normImage.at<float>(i, j) > thresh + 80){circle(g_srcImage1, Point(j, i), 5, Scalar(10, 10, 255), 2, 8, 0);circle(scaledImage, Point(j, i), 5, Scalar(0, 10, 255), 2, 8, 0);}}}imshow(WINDOW_NAME2, g_srcImage1);imshow(WINDOW_NAME3, scaledImage);
}

运行效果:


《OpenCV3编程入门》学习笔记10 角点检测(一)Harris角点检测相关推荐

  1. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  2. OpenCV3编程入门 学习笔记(总)

    OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...

  3. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)

    若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...

  4. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  5. 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步

    文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...

  6. 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV

    邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...

  7. Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题

    这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...

  8. Opencv3编程入门学习笔记(二)之显式创建Mat对象

    以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...

  9. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

  10. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

最新文章

  1. 《转》Python学习(14)-对文件的操作(一)
  2. 发推吐槽职场性别歧视后,苹果女高管被无限期行政休假
  3. 浅谈CSS重构样式表性能
  4. Windows2012R2服务器的安装与亮点功能介绍
  5. OOP设计思考——何时使用接口?
  6. php7 setcookie无效_PHP setcookie() 函数 | 菜鸟教程
  7. 三维空间长度温度数量_风电叶片模具水循环温度控制机及其智能化控制解析
  8. Ball Dropping
  9. summit_Linux注册简介开始,Open Hardware Summit寻求提交,等等
  10. S5PV210体系结构与接口10:MMU编程
  11. Apache目录介绍
  12. 在Linux上安装Mysql 以及 涉及问题
  13. python+opencv打开摄像头、拍摄指定次数的照片_python+openCV调用摄像头拍摄和处理图片的实现...
  14. [2018.07.31 T1] 第一题
  15. PowerDesigner关联表结构表示一对一或一对多
  16. Django-Templates模板语法(三)
  17. js禁止鼠标滑轮_js 禁止鼠标滑轮滚动的事件
  18. html网页文字链接的若干问题
  19. php mysql 家谱_mysql家谱表查询某人所有后代
  20. 删除360天擎(企业版)---不知道密码情况下

热门文章

  1. 离线安装Visual Studio Code插件
  2. 面试常碰到++p/p--问题到底结果是什么?
  3. 文件句柄和文件描述符的区别和理解指针
  4. 中国地址住址五级以下
  5. 文件读取输出-python
  6. Attention机制_pytorch
  7. Lock、ReentrantLock、ReentrantReadWriteLock原理及应用深入解析
  8. TensorRT Analysis Report分析报告
  9. 嵌入式Linux的OTA更新,基础知识和实现
  10. 图像超分辨率算法:CVPR2020