OpenCV哈里斯角检测|Harris Corner理论实践

目录
  • 目标
  • 理论
  • OpenCV中的哈里斯角检测
  • SubPixel精度的转角

目标

在本章中,将学习

  • "Harris Corner Detection”背后的思想
  • 函数:cv2.cornerHarris(),cv.2cornerSubPix()

理论

可以用如下图来表示:

因此,Harris Corner Detection的结果是具有这些分数的灰度图像。合适的阈值可提供图像的各个角落。

OpenCV中的哈里斯角检测

在OpenCV中有实现哈里斯角点检测,cv2.cornerHarris()。其参数为:

dst = cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]] )

  • src - 输入图像,灰度和float32类型
  • blockSize - 是拐角检测考虑的邻域大小
  • ksize - 使用的Sobel导数的光圈参数
  • k- 等式中的哈里斯检测器自由参数
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('chessboard.png')
img_copy = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
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()]=[255,0,0]
# plot
plt.subplot(121)
plt.imshow(img_copy, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.subplot(122)
plt.imshow(img, cmap='gray')
plt.xticks([])
plt.yticks([])
plt.show()

以下是结果:

可以看到,各个角点已经标红。

SubPixel精度的转角

有时候可能需要找到最精确的角点。OpenCV附带了一个函数cv2.cornerSubPix(),它进一步细化了以亚像素精度检测到的角点。下面是一个例子。

  • 和之前一样,首先需要先找到哈里斯角点
  • 然后通过这些角的质心(可能在一个角上有一堆像素,取它们的质心)来细化它们
  • Harris角用红色像素标记,SubPixel角用绿色像素标记

对于cv2.cornerSubPix()函数,必须定义停止迭代的条件。我们可以在特定的迭代次数或达到一定的精度后停止它。此外,还需要定义它将搜索角点的邻居的大小。

corners = cv.cornerSubPix( image, corners, winSize, zeroZone, criteria )

  • image: 输入图像,单通道
  • corners: 输入的初始坐标和为输出提供的精制坐标
  • winSize: 搜索窗口的一半侧面长度
  • zeroZone: 搜索区域中间的死区大小的一半在下面的公式中的求和,有时用于避免自相关矩阵的可能奇点。(−1,−1)(-1,-1)(−1,−1) 的值表示没有这样的尺寸
  • criteria: 终止角点细化过程的条件
# sub pixel更精度角点
import cv2
import numpy as np
img = cv2.imread('chessboard2.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# find Harris corners
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.imshow('subpixel', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是结果, 可以看到SubPixel更精确一点:

附加资源

docs.opencv.org/4.1.2/dd/d1…

docs.opencv.org/4.1.2/dd/d1…

docs.opencv.org/4.1.2/dd/d1…

docs.opencv.org/4.1.2/d4/d8…

docs.opencv.org/4.1.2/dd/d1…

以上就是OpenCV哈里斯角检测|Harris Corner理论实践的详细内容,更多关于OpenCV哈里斯角检测的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android OpenCV基础API清晰度亮度识别检测

    目录 背景 基础知识 主要Api - 加载图片 imread Utils.bitmapToMat 主要API - 写入图片 端侧常用分析方法 亮度检测 清晰度检测 最后 背景 工作中遇到业务诉求是通过OpenCV对图片进行一些判断操作和优化,这里是看了部分不错的文章,希望总结一个自己的学习过程,温故而知新,有不对的地方可以评论区指出,小白学习海涵. 基础知识 Mat在OpenCV中是非常重要的存在,后续各个API都是在Mat的基础上去做文章,Mat 是Matrix(矩阵)的缩写 ... inli

  • golang 开启opencv图形化编程

    目录 正文 环境配置 API编程 常用API OpenVideoCapture VideoCaptureDevice VideoCaptureFile NewWindow SetWindowTitle NewMat NewMatWithSize NewMatFromScalar NewCascadeClassifier Load 正文 最近在国外一个嵌入式编程网站上看到其平台支持Opencv库,出于好奇在其说明文档上看到gocv.io Opencv golang库的官网.就是下面这个. 在开启编

  • opencv python截取圆形区域的实现

    目录 一.先进行剪切操作 二.去除背景 总结 一.先进行剪切操作 圆形区域占图片可能不多,多余的部分不要.看下图. 只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要.先沿着纽扣电池的边缘剪切出来感兴趣的区域.有2个方法,用寻找轮廓外接圆的方法,或者基尔霍夫圆的方法.在这里以轮廓外接圆方法为例.代码如下: import cv2 import numpy as np image = cv2.imread('F:\Siamese-pytorch-master\datasets\images_b

  • opencv调用yolov3模型深度学习目标检测实例详解

    目录 引言 建立相关目录 代码详解 附源代码 引言 opencv调用yolov3模型进行深度学习目标检测,以实例进行代码详解 对于yolo v3已经训练好的模型,opencv提供了加载相关文件,进行图片检测的类dnn. 下面对怎么通过opencv调用yolov3模型进行目标检测方法进行详解,付源代码 建立相关目录 在训练结果backup文件夹下,找到模型权重文件,拷到win的工程文件夹下 在cfg文件夹下,找到模型配置文件,yolov3-voc.cfg拷到win的工程文件夹下 在data文件夹下

  • OpenCV哈里斯角检测|Harris Corner理论实践

    目录 目标 理论 OpenCV中的哈里斯角检测 SubPixel精度的转角 目标 在本章中,将学习 "Harris Corner Detection”背后的思想 函数:cv2.cornerHarris(),cv.2cornerSubPix() 理论 可以用如下图来表示: 因此,Harris Corner Detection的结果是具有这些分数的灰度图像.合适的阈值可提供图像的各个角落. OpenCV中的哈里斯角检测 在OpenCV中有实现哈里斯角点检测,cv2.cornerHarris().其参

  • OpenCV哈里斯(Harris)角点检测的实现

    环境 pip install opencv-python==3.4.2.16 pip install opencv-contrib-python==3.4.2.16 理论 克里斯·哈里斯(Chris Harris)和迈克·史蒂芬斯(Mike Stephens)在1988年的论文<组合式拐角和边缘检测器>中做了一次尝试找到这些拐角的尝试,所以现在将其称为哈里斯拐角检测器. 函数:cv2.cornerHarris(),cv2.cornerSubPix() 示例代码 import cv2 impor

  • OpenCV特征提取与检测之Harris角点检测

    目录 前言 1. 效果图 2. 原理 3. 源码 3.1 Harris角点检测 3.2 精细角点检测 总结 前言 这篇博客将了解什么是特征,角点,哈里斯角点检测(Harris Corner Detection)的概念.并使用cv2.cornerHarris(),cv2.cornerSubPix()实现哈里斯角点检测: 1. 效果图 原图 VS Harris角点检测效果图如下: 原图 VS Harris角点检测效果图如下: 惊细角点效果图如下:Harris角点用红色像素标记,精细角点用绿色像素标记

  • Python中OpenCV图像特征和harris角点检测

    目录 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 import cv2 import numpy as np img =cv2.imread('pie.png') print('img.shape',img.

  • OpenCV特征提取与检测之Shi-Tomasi角点检测器

    前言 角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维重建和目标识别等,也可称为特征点检测. 角点检测算法的基本思想: 使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点. 目前,角点检测算法还不是十

  • opencv实现角点检测

    本文实例为大家分享了opencv实现角点检测的具体代码,供大家参考,具体内容如下 1.特征点的作用:使用特征点代表图像内容 运动目标跟踪物体识别图像配准全景图像拼接三维重建 2.Harris角点检测基本思想 角点定义 :窗口向任意方向的移动都导致图像灰度的明显变化 平坦区域:任意方向移动,无灰度变化 边缘: 沿着边缘方向移动,无灰度变化 #include "opencv2/opencv.hpp" #include <iostream> using namespace cv;

  • 基于MFC和OpenCV实现角点检测

    本文实例为大家分享了MFC和OpenCV实现角点检测的具体代码,供大家参考,具体内容如下 // 角点检测 // 根据<基于OpenCV的计算机视觉技术实现> #define max_corners 200; // 限定的最大角点数 IplImage* srcImage = 0; // 待处理的源图像 IplImage* ImageShow = 0; // 存储显示带角点的图像 IplImage* grayImage = 0; // 原始图像转换成的灰阶图像 IplImage* corners1

  • opencv实现棋盘格检测

    本文实例为大家分享了opencv实现棋盘格检测的具体代码,供大家参考,具体内容如下 代码: #include <iostream> #include <vector> #include <opencv2/opencv.hpp>   #include <opencv2/xfeatures2d.hpp> #include <opencv2/optflow/motempl.hpp> using namespace cv;   using namespa

  • 基于openCV实现人脸检测

    openCV的人脸识别主要通过Haar分类器实现,当然,这是在已有训练数据的基础上.openCV安装在 opencv/opencv/sources/data/haarcascades_cuda(或haarcascades)中存在预先训练好的物体检测器(xml格式),包括正脸.侧脸.眼睛.微笑.上半身.下半身.全身等. openCV的的Haar分类器是一个监督分类器,首先对图像进行直方图均衡化并归一化到同样大小,然后标记里面是否包含要监测的物体.它首先由Paul Viola和Michael Jon

  • OpenCV实现人脸检测

    前段日子,写了个人脸检测的小程序,可以检测标记图片.视频.摄像头中的人脸.效果还行吧,用的是opencv提供人脸库.至于具体的人脸检测原理,找资料去啃吧. 环境:VS2013+OPENCV2.4.10+Win8.1 一.基于对话框的MFC 首先,新建一个基于对话框的MFC应用程序,命名为myFaceDetect(取消"安全开发周期(SDL)检查"勾选,我自己习惯取消这个). 放置Button,设置Button的ID和Caption. 图片按钮--ID:IDC_FACEDETECT 视频

随机推荐