首页 > 编程语言 >OpenCV-Python Harris 角点检测

OpenCV-Python Harris 角点检测

时间:2024-11-20 08:49:10浏览次数:3  
标签:gray img Python dst cv2 角点 OpenCV Harris np

原理
  在上一节我们已经知道了角点的一个特性:向任何方向移动变化都很大。Chris_Harris 和 Mike_Stephens 早在 1988 年的文章《A CombinedCorner and Edge Detector》中就已经提出了焦点检测的方法,被称为Harris 角点检测。他把这个简单的想法转换成了数学形式。将窗口向各个方向移动(u,v)然后计算所有差异的总和。表达式如下:

      E(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}]^2

窗口函数可以是正常的矩形窗口也可以是对每一个像素给予不同权重的高斯窗口
角点检测中要使 E (µ,ν) 的值最大。这就是说必须使方程右侧的第二项的取值最大。对上面的等式进行泰勒级数展开然后再通过几步数学换算(可以参考其他标准教材),我们得到下面的等式:

      E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix}

其中

      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}

这里 I x 和 I y 是图像在 x 和 y 方向的导数。(可以使用函数 cv2.Sobel()
计算得到)。
然后就是主要部分了。他们根据一个用来判定窗口内是否包含角点的等式进行打分。

      R = det(M) - k(trace(M))^2

其中

det(M) = \lambda_1 \lambda_2
trace(M) = \lambda_1 + \lambda_2

• λ 1 和 λ 2 是矩阵 M 的特征值所以根据这些特征中我们可以判断一个区域是否是角点,边界或者是平面。
  • 当 λ 1 和 λ 2 都小时,|R| 也小,这个区域就是一个平坦区域。
  • 当 λ 1 ≫ λ 2 或者 λ 1 ≪ λ 2 ,时 R 小于 0,这个区域是边缘
  • 当 λ 1 和 λ 2 都很大,并且 λ 1 ~λ 2 中的时,R 也很大,(λ 1 和 λ 2 中的最小值都大于阈值)说明这个区域是角点。

30.1 OpenCV 中的 Harris 角点检测
 Open 中的函数 cv2.cornerHarris() 可以用来进行角点检测。参数如下:
  • img - 数据类型为 float32 的输入图像。
  • blockSize - 角点检测中要考虑的领域大小。
  • ksize - Sobel 求导中使用的窗口大小
  • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
例子如下:

import cv2
import numpy as np

filename = 'chessboard.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)

#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None)

# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]

cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

30.2 亚像素级精确度的角点
  有时我们需要最大精度的角点检测。OpenCV 为我们提供了函数 cv2.cornerSubPix(),它可以提供亚像素级别的角点检测。下面是一个例子。首先我们要找到 Harris角点,然后将角点的重心传给这个函数进行修正。Harris 角点用红色像素标出,绿色像素是修正后的像素。在使用这个函数是我们要定义一个迭代停止条件。当迭代次数达到或者精度条件满足后迭代就会停止。我们同样需要定义进行角点搜索的邻域大小。

import cv2
import numpy as np

filename = 'chessboard2.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# find Harris corners
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
dst = cv2.dilate(dst,None)
ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)

# find centroids
ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)

# define the criteria to stop and refine the corners
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv2.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)

# Now draw them
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]

cv2.imwrite('subpixel5.png',img)

标签:gray,img,Python,dst,cv2,角点,OpenCV,Harris,np
From: https://blog.csdn.net/m0_37302966/article/details/143901124

相关文章

  • 【Linux】将python文件上传到GitHub(新版图文逐步详解)
    1.进入想要上传文件所在的文件夹,这里以如下图中目录下的t1为例2.输入如下命令,将当前目录变为git可以管理的目录gitinit3.将想要上传的文件添加到缓冲区gitaddt1.py出错了,查阅资料发现出现该提示是因为.gitignore文件中有规则将t1.py文件(或其所在目录)排除了,如果......
  • Python中的requests模块详解
    requests基础操作定义requests是一个基于网络请求的模块。可以使用程序模拟浏览器上网。环境安装pipinstallrequests编码流程指定url(相当于在浏览器地址栏输入一个网址)发起请求(相当于浏览器按下回车)获取响应数据(相当于浏览器请求到的数据/返回的页......
  • 使用python快速合并文件夹内excel数据
    数据分析的时候文件太多,一个一个合并效率太慢?有没有方便的方法快速合并他们本文作者使用jupyternotebook采用以下代码实现excel数据合并功能importpandasaspdimportos#设置文件夹路径folder_path='D:\\你自己的路径'#找到所有Excel文件excel_files=[file......
  • python:reflection 反射
    C#面象对象的语言也有类似的反射  reflection便于根据配置文件,方便切换数据库。切换DAL层即可。#encoding:utf-8#版权所有2024©涂聚文有限公司#许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎#描述:#Author:geovindu,GeovinDu涂聚文.#IDE......
  • python: generator IDAL and DAL using sql server 2019
     createIDAL#encoding:utf-8#版权所有2024©涂聚文有限公司#许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python3.11#OS:windows10#Datetime:2024/......
  • 三维测量与建模笔记 - 点特征提取 - 4.3 Harris特征点
            在3D重建应用中,很重要的一个场景是找到两幅图像中的同名特征点,这个过程需要对特征点进行提取和描述。    从上面描述可以看出,如果窗口处于颜色变化不明显或者没有变化的区域,E的值很小或为0;如果窗口处于边缘位置,则值变化相对较小;如果窗口处于角点......
  • Python-开发运动会计分管理软件
    PYTHON-开发运动会计分管理软件项目概述1.软件功能我们的运动会计分管理软件具有以下功能:添加运动员:提供接口让用户输入运动员的基本信息,包括分组、姓名、名次。管理分组:支持创建、修改和删除运动员分组,方便组织和查看。得分计算:根据运动员名次自动计算得分,并在用户界面中......
  • Python 时间模块(time,datetime)
    在Python中,time模块和datetime模块都与时间处理相关,但它们有着不同的特点和用途,以下为你详细介绍:一.time模块概述:time模块提供了各种与时间相关的函数,它主要围绕着时间戳(从1970年1月1日00:00:00UTC到某个时刻所经过的秒数)来进行操作,常用于获取当前时间、对时间进......
  • 解释爬虫的基本概念,以及它的作用,并讲解如何使用 Python 实现网络爬虫。
    爬虫是一种自动化程序,用于从互联网上收集数据。它通过模拟人类访问网页的行为,自动发送HTTP请求,获取网页内容,并抽取所需的数据。爬虫的作用非常广泛。它可以用于搜索引擎的网页索引,获取新闻、博客等网页内容,进行数据挖掘和分析,监测网站的变化等。Python是一种常用的编程语言......
  • Zmap+python脚本+burp实现自动化Fuzzing测试
    声明学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。✍......