opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()

前面我们已经了解了Harris函数来进行角点检测,因为角点的特性,这些角点在图像旋转的时候也可以被检测到。但是,如果我们放大或缩小图像时,就可能会丢失图像的某些部分,甚至有可能增加角点的质量。这种损失的现象需要一种与图像比例无关的角点检测方法来解决。

SIFT(Scale-Invariant Feature Transform)尺度不变特征变换可以解决这个问题。

注意: SIFT 并不检测关键点(关键点由Difference of Gaussians检测),SIFT会通过一个特征向量来描述关键点周围区域的情况。DoG操作的最终结果会得到感兴趣的区域(关键点),这将通过SIFT来进行说明。

函数说明:

sift =cv2.SIFT_create([, nfeatures[, nOctaveLayers[,

contrastThreshold, edgeThreshold]]])

参数

  • nfeatures: 保留的最佳功能的数量。这些特征按其分数排名(在SIFT算法中作为局部对比度测量)。

  • nOctaveLayers:每个八度中的层数。3是D.Lowe(原作者)论文中使用的值。八度的数量是根据图像分辨率自动计算的。

  • contrastThreshold:用于过滤掉半均匀(低对比度)区域中的弱特征的对比度阈值。阈值越大,检测器产生的特征越少。应用过滤时,对比度阈值将被nOctaveLayers除。当nOctaveLayers设置为默认值并且如果要使用D.Lowe论文中使用的值0.03时,请将此参数设置为0.09。

  • edgeThreshold:用于过滤边缘特征的阈值。请注意,其含义与contrastThreshold不同,即edgeThreshold越大,滤除的特征越少(保留的特征越多)。

返回值

  • sift:实例化一个sift特征检测器。

示例:对图像检测DoG特征并提取SIFT描述符

实验原图:

cpp 复制代码
import cv2
import numpy as np

img = cv2.imread('images\\sumian.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)

img = cv2.drawKeypoints(image= img, outImage= img, keypoints= keypoints, flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color= (0, 0, 255))

cv2.imshow('sift', img)
cv2.waitKey()
cv2.destroyAllWindows()

发现是,如果你沿用之前的代码即

descriptor = cv2.xfeatures2d.SIFT_create()

会出现一个warning,但不影响结果。

cpp 复制代码
[ WARN:0@0.037] global shadow_sift.hpp:15 cv::xfeatures2d::SIFT_create DEPRECATED: cv.xfeatures2d.SIFT_create() is deprecated due SIFT tranfer to the main repository. https://github.com/opencv/opencv/issues/16736

这是因为新版本的SIFT可以直接引用,不再需要安装contrib包,即

descriptor = cv2.SIFT_create()

官方公告可参见 OpenCV Google Summer of Code 2020

新代码如下:

cpp 复制代码
import cv2


img = cv2.imread('images\\sumiao.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#sift = cv2.xfeatures2d.SIFT_create()
sift = cv2.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)

img = cv2.drawKeypoints(image= img, outImage= img, keypoints= keypoints, flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color= (0, 0, 255))

cv2.imshow('sift', img)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

相关推荐
fīɡЙtīиɡ ℡2 小时前
AI 应用系统设计
java·开发语言·人工智能
小淮AI2 小时前
国际教育课程的本土化探索:以枫叶教育三十年为观察样本
大数据·人工智能
又折桃枝换酒钱2 小时前
VisCoder2:构建多语言可视化编码智能体(翻译与解读)
人工智能·信息可视化
AI绘画哇哒哒2 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
Chengbei112 小时前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
QN1幻化引擎2 小时前
DalinX Phi 性能突破:跨层秩保持对齐与意识涌现度量的实证研究
人工智能·ai·架构·agi·asi
NeilCarmack2 小时前
Deepseek-harness增加桌面版端序列:第 1 讲 · 命令解析:`pnpm dsh desktop` 的第一步
人工智能·agent·ai agent
龙兵AI增长破局圈.赵老师讲成交3 小时前
只有把过程管好,结果才会出来。
大数据·人工智能·ai·创业创新
最强小杰3 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
天天代码码天天3 小时前
我做了一个只有一个 EXE 的本地 Markdown 编辑器:lw.MD(简墨)
人工智能