网站首页 > 技术文章 正文
一、Harris Corner Detection 触点检测
Harris角点检测由Chris Harris和Mike Stephens在1988年提出,是通过数学计算在图像上发现角点特征的一种算法,而且其具有旋转不变性的特质。OpenCV中的Shi-Tomasi角点检测就是基于Harris角点检测改进算法。
1. 算法步骤:
算法详细步骤
- 计算图像X方向与Y方向的一阶高斯偏导数Ix与Iy
- 根据第一步结果得到Ix^2 , Iy^2与Ix*Iy值
- 高斯模糊第二步三个值得到Sxx, Syy, Sxy
- 定义每个像素的Harris矩阵,计算出矩阵的两个特质值
- 计算出每个像素的R值
- 使用3X3或者5X5的窗口,实现非最大值压制
- 根据角点检测结果计算,最提取到的关键点以绿色标记,显示在原图上。
OpenCV的CornerHarris函数: cv2.cornerHarris(src=gray, blockSize=9, ksize=23, k=0.04)
参数说明:
- src - 数据类型为 float32 的输入图像。
- blockSize - 角点检测中要考虑的领域大小。
- ksize - Sobel 求导中使用的窗口大小
- k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
示例代码:
# -*- coding: utf-8 -*- # !/usr/bin/python import cv2 import numpy as np filename = 'test.jpg' img = cv2.imread(filename) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = np.float32(gray) dst = cv2.cornerHarris(gray, 2, 3, 0.04) 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()
二、Shi-Tomasi角点检测
Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
corners = cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]] )
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('t1.jpg') src = cv.cvtColor(img, cv.COLOR_BGR2RGB) gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) corners = cv.goodFeaturesToTrack(gray, 25, 0.01, 10) corners = np.int0(corners) for i in corners: x, y = i.ravel() cv.circle(img, (x, y), 3, 255, -1) plt.subplot(1, 2, 1) plt.title('src') plt.imshow(src) plt.subplot(1, 2, 2) plt.title('corners') img = cv.cvtColor(img, cv.COLOR_BGR2RGB) plt.imshow(img) plt.show()
三、DOG和SIFT算法
- DoG是对同一图像使用不同高斯滤波器所得的结果。
- SIFT是通过一个特征向量来描述关键点周围区域的情况。
需要安装 opencv-contrib-python 库
import cv2 # 读取图片并灰度处理 imgpath = 'test.jpg' img = cv2.imread(imgpath) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 创建SIFT对象 sift = cv2.xfeatures2d.SIFT_create() # 将图片进行SURF计算,并找出角点keypoints,keypoints是检测关键点 # descriptor是描述符,这是图像一种表示方式,可以比较两个图像的关键点描述符,可作为特征匹配的一种方法。 keypoints, descriptor = sift.detectAndCompute(gray, None) img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints, flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(51, 163, 236)) # 显示图片 cv2.imshow('sift_keypoints', img) cv2.waitKey(0) cv2.destroyAllWindows()
四、SURF特征检测算法
比SIFT算法快,并吸收了SIFT算法的思想。SURF采用Hessian算法检测关键点,而SURF是提取特征,这个与SIFT很像。Opencv的SURF类是Hessian算法和SURF算法组合。
import cv2 # 读取图片并灰度处理 imgpath = 'test.jpg' img = cv2.imread(imgpath) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 创建SURF对象,对象参数float(4000)为阈值,阈值越高,识别的特征越小。 sift = cv2.xfeatures2d.SURF_create(float(4000)) # 将图片进行SURF计算,并找出角点keypoints,keypoints是检测关键点 # descriptor是描述符,这是图像一种表示方式,可以比较两个图像的关键点描述符,可作为特征匹配的一种方法。 keypoints, descriptor = sift.detectAndCompute(gray, None) img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints, flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(51, 163, 236)) # 显示图片 cv2.imshow('sift_keypoints', img) cv2.waitKey(0) cv2.destroyAllWindows()
其它还有 FAST、BRIEF、ORB等特征检测算法。
- 上一篇: Flask—远程查看行空板USB摄像头视频
- 下一篇: 机器视觉技术(一)边缘提取(机器视觉边缘检测)
猜你喜欢
- 2024-09-11 给3D Slicer添加Python第三方插件库
- 2024-09-11 使用Python创建自己的Instagram滤镜
- 2024-09-11 薅羊毛我愿称Python为最强,Python 自动化带你轻松赚钱
- 2024-09-11 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门
- 2024-09-11 使用python实现简易的人脸检测(python人脸检测106关键点)
- 2024-09-11 机器视觉技术(一)边缘提取(机器视觉边缘检测)
- 2024-09-11 Flask—远程查看行空板USB摄像头视频
- 2024-09-11 OpenCV+Python识别车牌和字符分割的实现
- 2024-09-11 在Fedora中安装OpenCV-Python | 二
- 2024-09-11 使用Python实现增强现实(AR)(python图像数据增强)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)