OpenCV-Python 哈里斯角检测 | 三十七
目标
在本章中,
- 我们将了解"Harris Corner Detection”背后的概念。
- 我们将看到以下函数:cv.cornerHarris(),cv.cornerSubPix()
理论
在上一章中,我们看到角是图像中各个方向上强度变化很大的区域。Chris Harris和Mike Stephens在1988年的论文《组合式拐角和边缘检测器》中做了一次尝试找到这些拐角的尝试,所以现在将其称为哈里斯拐角检测器。他把这个简单的想法变成了数学形式。它基本上找到了(u,v)(u,v)(u,v)在所有方向上位移的强度差异。表示如下:
E(u,v)=∑x,yw(x,y)⏟window function [I(xu,yv)⏟shifted intensity−I(x,y)⏟intensity]2E(u,v) = \sum_{x,y} \underbrace{w(x,y)}_\text{window function} \, [\underbrace{I(x u,y v)}_\text{shifted intensity}-\underbrace{I(x,y)}_\text{intensity}]^2E(u,v)=x,y∑window functionw(x,y)[shifted intensityI(xu,yv)−intensityI(x,y)]2
窗口函数要么是一个矩形窗口,要么是高斯窗口,它在下面赋予了值。
我们必须最大化这个函数E(u,v)E(u,v)E(u,v)用于角检测。这意味着,我们必须最大化第二个项。将泰勒扩展应用于上述方程,并使用一些数学步骤(请参考任何你喜欢的标准文本书),我们得到最后的等式:
E(u,v)≈[uv]M[uv]E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix}E(u,v)≈[uv]M[uv]
其中
M=∑x,yw(x,y)[IxIxIxIyIxIyIyIy]M = \sum_{x,y} w(x,y) \begin{bmatrix}I_x I_x & I_x I_y \\ I_x I_y & I_y I_y \end{bmatrix}M=x,y∑w(x,y)[IxIxIxIyIxIyIyIy]
在此,IxI_xIx和IyI_yIy分别是在x和y方向上的图像导数。(可以使用cv.Sobel()轻松找到)。
然后是主要部分。之后,他们创建了一个分数,基本上是一个等式,它将确定一个窗口是否可以包含一个角。
R=det(M)−k(trace(M))2R = det(M) - k(trace(M))^2R=det(M)−k(trace(M))2
其中
- det(M)=λ1λ2det(M)=\lambda_1\lambda_2det(M)=λ1λ2
- trace(M)=λ1λ2trace(M)=\lambda_1 \lambda_2trace(M)=λ1λ2
- λ1\lambda_1λ1 and λ2\lambda_2λ2 是 MMM 的特征值
因此,这些特征值的值决定了区域是拐角,边缘还是平坦。
- 当∣R∣|R|∣R∣较小,这在λ1\lambda_1λ1和λ2\lambda_2λ2较小时发生,该区域平坦。
- 当R<0R<0R<0时(当λ1>>λ2\lambda_1 >>\lambda_2λ1>>λ2时发生,反之亦然),该区域为边。
- 当RRR很大时,这发生在λ1\lambda_1λ1和λ2\lambda_2λ2大且λ1\lambda_1λ1~λ2\lambda_2λ2时,该区域是角。
可以用如下图来表示:
因此,Harris Corner Detection的结果是具有这些分数的灰度图像。合适的阈值可为您提供图像的各个角落。我们将以一个简单的图像来完成它。
OpenCV中的哈里斯角检测
为此,OpenCV具有函数cv.cornerHarris()。其参数为:
- img - 输入图像,应为灰度和float32类型。
- blockSize - 是拐角检测考虑的邻域大小
- ksize - 使用的Sobel导数的光圈参数。
- k - 等式中的哈里斯检测器自由参数。
请参阅以下示例:
import numpy as np
import cv2 as cv
filename = 'chessboard.png'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#result用于标记角点,并不重要
dst = cv.dilate(dst,None)
#最佳值的阈值,它可能因图像而异。
img[dst>0.01*dst.max()]=[0,0,255]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
cv.destroyAllWindows()
以下三个结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7L41WveY-1582724853069)(5_2_哈里斯角检测.assets/harris_result.jpg)]
SubPixel精度的转角
有时,你可能需要找到最精确的角落。OpenCV附带了一个函数cv.cornerSubPix(),它进一步细化了以亚像素精度检测到的角落。下面是一个例子。和往常一样,我们需要先找到哈里斯角。然后我们通过这些角的质心(可能在一个角上有一堆像素,我们取它们的质心)来细化它们。Harris角用红色像素标记,精制角用绿色像素标记。对于这个函数,我们必须定义何时停止迭代的条件。我们在特定的迭代次数或达到一定的精度后停止它,无论先发生什么。我们还需要定义它将搜索角落的邻居的大小。
import numpy as np
import cv2 as cv
filename = 'chessboard2.jpg'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 寻找哈里斯角
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
dst = cv.dilate(dst,None)
ret, dst = cv.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)
# 寻找质心
ret, labels, stats, centroids = cv.connectedComponentsWithStats(dst)
# 定义停止和完善拐角的条件
criteria = (cv.TERM_CRITERIA_EPS cv.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
# 绘制
res = np.hstack((centroids,corners))
res = np.int0(res)
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]] = [0,255,0]
cv.imwrite('subpixel5.png',img)
以下是结果,其中一些重要位置显示在缩放窗口中以可视化:
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
OpenCV中文官方文档:
http://woshicver.com/
OpenCV-Python 哈里斯角检测 | 三十七的更多相关文章
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- Python之路(第三十七篇)并发编程:进程、multiprocess模块、创建进程方式、join()、守护进程
一.在python程序中的进程操作 之前已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序 ...
- 手把手教你如何用 OpenCV + Python 实现人脸检测
配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...
- opencv python:直线检测 与 圆检测
霍夫直线变换介绍 霍夫圆检测 现实中: example import cv2 as cv import numpy as np # 关于霍夫变换的相关知识可以看看这个博客:https://blog.c ...
- Opencv+Python实现缺陷检测
实验七.缺陷检测 一. 题目描述 对下面的图片进行缺陷检测操作,请详细地记录每一步操作的步骤. 第一站图片是标准样品,后面几张图中有几个样品有瑕疵,需要你通过计算在图片上显示出哪张是合格,哪张 ...
- python接口自动化(三十七)-封装与调用--读取excel 数据(详解)
简介 在进行软件接口测试或设计自动化测试框架时,一个不比可避免的过程就是: 参数化,在利用python进行自动化测试开发时,通常会使用excel来做数据管理,利用xlrd.xlwt开源包来读写exce ...
- opencv python运动人体检测
采用非极大值抑制,将重叠的框合并成一个. # import the necessary packages from imutils.object_detection import non_max_su ...
- opencv+python实时人脸检测、磨皮
import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...
- 【OpenCV十六新手教程】OpenCV角检测Harris角点检测
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨) ...
随机推荐
- 学习日记:Python爬虫-1
这几天在b站看小甲鱼的python3教程,照着写了个有道翻译的程序 代码中字典data中的内容,用浏览器审查元素,先随便输一个要翻译的,找到跳出来的post的那个网址,看formdata就行了 返回的 ...
- nginx 命令行参数 启动 重启 重载 停止
今天和大家分享关于 nginx 的一些参数使用 首先,你应该安装了nginx CentOS 安装 nginx 这是很早之前的一篇博客,可以参考. 之前,我们如何去操作 nginx ##简单粗暴法 pk ...
- SQL基本操作总结
1.SQL简介 结构化查询语言 (层次模型,网状模型,关系模型) 关系模型是目前的主流 (Oralce,mysql mssql ) SQL标准:ANSI (1992 1997 2002 ISO) 方言 ...
- 量化投资学习笔记37——《Python机器学习应用》课程笔记10
用KNN算法来进行数字识别,还是用sklearn自带的digits数据集. coding:utf-8 KNN算法实现手写识别 from sklearn import neighbors from sk ...
- PHPRAP 1.0.2 发布,修复安装失败 Bug 和优化细节
PHPRAP,是一个PHP轻量级开源API接口文档管理系统,致力于减少前后端沟通成本,提高团队协作开发效率,打造PHP版的RAP. 更新记录 [修复]修复在MySQL5.5版本下安装数据初始化sql文 ...
- 微服务优化之使用gRPC做微服务的内部通信
使用gRPC做微服务的内部通信 gRPC是一个由Google开源的远程服务调用框架,具有多路复用和双向流式通信的特性. 大家好,在本文中将为大家介绍为什么我们应该使用gRPC代替RESTful或JSO ...
- vue相关坑
1:vue 动态加载图片路径报错解决方法,循环遍历图片不显示图片 解决方法:https://www.cnblogs.com/qingcui277/p/8930507.html
- Javascript中String()和new String()的区别——JS的包装对象
最近在看Symbol不能使用new操作符,然后类比到Number,String,Boolean,因为它们同属于基本类型,但是有有所差异:Number,String,Boolean是可以使用new操作符 ...
- 最简单易懂的实现CRC16校验
public String getCRC16(byte[] bytes) { //CRC寄存器全为1 int CRC = 0x0000ffff; //多项式校验值 int POLYNOMIAL = 0 ...
- Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...